2016-07-15 3 views
1

У меня есть таблицы:Возвращение логики от контроллера в View Laravel 5

REGIONS 

id | name 
----+------------------ 
1 | South Luzon 
----+------------------ 
2 | North West Luzon 
----+------------------ 
3 | North East Luzon 

===================================== 

BRANCHES 

machinenum | name  | region_id 
-----------+-----------+----------- 
108  | Alaminos | 1 
-----------+-----------+----------- 
104  | Alexander | 3 
-----------+-----------+----------- 
131  | Santiago | 3 
-----------+-----------+----------- 
114  | Apalit | 1 
-----------+-----------+----------- 
137  | Baliuag | 1 
-----------+-----------+----------- 
115  | Baguio | 2 
-----------+-----------+----------- 
116  | Bantay | 2 
-----------+-----------+----------- 
130  | San Jose | 3 

======================================= 

USERS 

id | name | machinenum 
---+-------+------------- 
1 | user1 | 108 
---+-------+------------- 
2 | user2 | 104 
---+-------+------------- 
3 | user3 | 131 

======================================== 

PENDINGS 

user_id | docdate 
--------+------------ 
2  | 2016-07-14 
--------+------------ 
1  | 2016-07-13 
--------+------------ 
1  | 2016-07-14 
--------+------------ 
3  | 2016-07-13 

То, что я хочу, чтобы отобразить все ожидающие посланный пользователей, сгруппированных по отраслям и регионам. Так что мой запрос, как выбрать все регионы, и внутри цикла отдельных отраслей, которые соответствовали region_id, inner joinusers TBL, чтобы получить user_id и внутри этого, выберите все в ожидании, что соответствует, совпадающий user_id и отобразить docdate если запрос возвращает NOT NULL иначе дисплей 0.

Вот мой запрос внутри моего контроллера:

$regions = DB::select('SELECT * FROM regions'); 
     foreach ($regions as $region) { 
      echo $region->name . "<br>"; 
      $branches = DB::select('SELECT b.machinenum, b.name AS bname, u.id as uid 
            FROM branches AS b 
            INNER JOIN users AS u ON b.machinenum=u.machinenum 
            WHERE region_id=:id 
            ORDER BY b.name ASC', 
            ['id' => $region->id]); 
      foreach ($branches as $branch) { 
       echo $branch->bname . "<br>"; 
       $pendings = DB::select('SELECT * FROM pendings WHERE user_id=:id', ['id' => $branch->uid]); 
       if ($pendings) { 
        foreach ($pendings as $pending) { 
         echo $pending->docdate . "<br>"; 
        } 
        echo "<br>"; 
       } else { 
        echo "0 <br>"; 
       } 
      } 
      echo "<br>"; 
     } 

Результат будет:

South Luzon 
Alaminos 
2016-07-14 -- docdate 

Apalit 
0   -- return 0 if no pending 
Baliuag 
0   -- return 0 if no pending 

North West Luzon 
Baguio 
0   -- return 0 if no pending 
Bantay 
0   -- return 0 if no pending 

North East Luzon 
Alexander 
2016-07-13 -- docdate 
2016-07-14 -- docdate 

San Jose 
0   -- return 0 if no pending 
Santiago 
2016-07-13 -- docdate 

Ну, это именно то, что я хочу. Но эта логика находится внутри моего контроллера. Я хочу, чтобы это было на мой взгляд. Как я могу вернуть эту логику на мой взгляд? Есть ли способ сделать это? Все, что я могу сделать на мой взгляд, это @foreach and @if.

Вот мой текущий код, на мой взгляд (Не возражаете связь между пользователями и ветвей, у меня уже есть это в моей модели):

// Note! In controller I have: 

$regions = Region::all(); 
$branches = Branch::all(); 
$pendings = Pending::all(); 
return view('pending.index', compact('regions', 'branches', 'pendings')); 



<table class="table table-noborder table-extra-condensed"> 
    <thead> 
     <tr> 
      <th class="custom-td text-center">Date</th> 
     </tr> 
    </thead> 
    <tbody> 
     @foreach ($regions as $region) 
      <tr> 
       <th colspan="19">{{ $region->name }}</th> 
      </tr> 
      @foreach ($branches as $branch) 
       @if ($region->id === $branch->region_id) 
        <tr> 
         <td>{{ $branch->name }}</td> 
        </tr> 
        @foreach ($pendings as $pending) 
         @if ($branch->machinenum === $pending->user->machinenum) 
          <tr> 
           <td class="custom-td text-center">{{ $pending->docdate->format('d') }}</td> 
          </tr> 
         @endif 
        @endforeach 
       @endif 
      @endforeach 
     @endforeach 
    </tbody> 
</table> 

ответ

1

Давайте разбить его.

Вы можете сопоставить эти отношения с моделью региона и просто называть это «pendings», поэтому вы можете каскадировать реальность, чтобы сделать ее более читаемой и просто вызвать Region :: with ('branch') -> get(); и вернуть его так, как вы хотите. Проверьте это.

Вот как мы это сделаем.

//Region.php 
function branches(){ 
    return $this->hasMany('App\Branch')->with('usermachines'); 
} 

Вот хитрая часть, давайте представим, что таблица пользователей является многие ко многим таблице отношений между ветвями и pendings и ветви используют hasManyThrough сделать твердую часть для нас:

//Branch.php 
function usermachines(){ 
    return $this->hasManyThrough('App\Pending','App\User','machinenum','user_id')->with('pendings'); 
} 

Готово! При всей этой установке все, что вам нужно сделать, это:

в контроллере:

$regions = Region::with('branches')->get(); 
return view('pending.index', compact('regions')); 

и на ваш взгляд: Я удаляю свой второй Еогеасп и используя forelse, это как Еогеасп, но с еще для когда pendings равны нулю, CheckIt из:

<table class="table table-noborder table-extra-condensed"> 
<thead> 
    <tr> 
     <th class="custom-td text-center">Date</th> 
    </tr> 
</thead> 
<tbody> 
    @foreach ($regions as $region) 
     <tr> 
      <th colspan="19">{{ $region->name }}</th> 
     </tr> 
     @foreach ($region->branches as $branch) 
       <tr> 
        <td>{{ $branch->name }}</td> 
       </tr> 
       @forelse($branch->pendings as $pending) 
         <tr> 
          <td class="custom-td text-center">{{ $pending->docdate->format('d') }}</td> 
         </tr> 
       @empty 
         <tr> 
          <td>0</td> 
         </tr> 
       @endforelse 
     @endforeach 
    @endforeach 
</tbody> 

+0

Я получаю эту ошибку. Не знаю почему: BadMethodCallException в строке Builder.php 2345: вызов неопределенного метода Illuminate \ Database \ Query \ Builder :: all(). И добавьте 'td' в ваш' tr'. –

+0

Извините, должно быть get() вместо all() – Magus

+0

В вашем '@ forelse', разве это' $ branch-> usermachines-> pendings as $ pending'? Coz Я заработал, вместо того, чтобы просто '$ branch-> pendings как $ pending'. –

Смежные вопросы