2016-07-15 25 views
1

Ich habe Tabellen:Return Logik von Controller in Ansicht 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 

Was ich will, ist von den Benutzern gruppiert nach Branchen und Regionen alle anstehenden gesendet angezeigt werden soll. Also meine Frage ist, wie alle Regionen auswählen und in einer Schleife wählen Sie Zweige, die die region_id abgestimmt, inner join die users Tabl, um die user_id und innerhalb dieser zu erhalten, wählen alle anstehenden dass abgestimmt, dass der user_id abgestimmt und die docdate angezeigt, wenn die Abfrage NOT NULL sonst Anzeige 0.

Hier ist meine Frage in meinem Controller:

$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>"; 
     } 

Ergebnis sein wird:

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 

Nun, das ist genau das, was ich will. Aber diese Logik ist in meinem Controller. Ich möchte, dass es meiner Ansicht nach ist. Wie kann ich diese Logik aus meiner Sicht zurückgeben? Gibt es einen Weg, es zu tun? Alles, was ich aus meiner Sicht tun kann, ist @foreach and @if.

Hier ist mein aktueller Code aus meiner Sicht (Sie die Beziehung zwischen den Nutzern und Zweigen nichts dagegen, ich habe es schon in meinem Modell):

// 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> 

Antwort

1

Läßt sie es brechen.

Sie können diese Beziehungen auf Ihr Regionsmodell abbilden und es einfach 'pendings' nennen, so dass Sie die Realisierungen kaskadieren, um es lesbarer zu machen und einfach Region :: with ('branches') -> get() aufrufen; und lass es Dinge zurückbringen, wie du es willst. Hör zu.

So werden wir es machen.

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

Hier ist der schwierige Teil, lassen Sie sich die Benutzer vorgibt Tisch ein vieles zu viel Beziehungstabelle zwischen Zweigen und pendings und Verwendung Zweigen ist hasManyThrough den harten Teil für uns zu tun:

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

Fertig! Mit allen, die Einrichtung alles, was Sie tun müssen, ist:

in Ihrem Controller:

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

und in der Ansicht: ich Ihre zweite foreach entfernt und ein forelse verwenden, es ist wie foreach aber mit einem anderen für, wenn die pendings Null sind, checkit out:

<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

Ich erhalte diesen Fehler. Ich weiß nicht warum: BadMethodCallException in Builder.php Zeile 2345: Aufruf an undefinierte Methode Illuminate \ Database \ Query \ Builder :: all(). Und fügen Sie 'td' in Ihrem' tr' hinzu. –

+0

Sorry, sollte get() anstelle von all() – Magus

+0

In Ihrem '@ forelse', ist es nicht $ Zweig-> usermachines-> pendings als $ pending'? Coz ich habe es funktioniert anstatt nur $ Zweig-> pendings als $ pending'. –