2017-07-16 4 views
0

Ich habe einige Beispieldaten in einer einzigen MySQL-Tabelle, die Felder schedule_id, day_number, staff_id, shift_start_time, shift_end_time, hours_worked hat.Restrukturierung von Daten in Laravel eloquent von einzelnen MySQL-Tabelle

Ich bin immer noch relativ unerfahren, wenn es um MVC und Laravel Entwicklung geht, also suche ich nach einer Anleitung, wie man dieses Problem am besten löst.

Was ich brauche ist zu tun, um die Daten in einer Tabelle angezeigt werden, so dass es unter ähnlich formatiert ist: -

<table style="border: 1px solid black; text-align: center"> 
 
    <tr> 
 
    <th>Staff ID</th> 
 
    <th>Day 0</th> 
 
    <th>Day 1</th> 
 
    <th>Day 2</th> 
 
    <th>Day 3</th> 
 
    <th>Day 4</th> 
 
    <th>Day 5</th> 
 
    <th>Day 6</th> 
 
    </tr> 
 
    
 
    <tr> 
 
    <td>21</td> 
 
    <td>12:00:00 - 17:00:00</td> 
 
    <td>12:00:00 - 19:00:00</td> 
 
    <td>12:00:00 - 13:00:00</td> 
 
    <td></td> 
 
    <td>12:00:00 - 15:00:00</td> 
 
    <td>12:00:00 - 17:00:00</td> 
 
    <td>12:00:00 - 16:00:00</td> 
 
    </tr> 
 
    
 
    <tr> 
 
    <td>24</td> 
 
    <td></td> 
 
    <td></td> 
 
    <td>11:00:00 - 19:00:00</td> 
 
    <td>11:00:00 - 13:00:00</td> 
 
    <td>10:00:00 - 15:00:00</td> 
 
    <td>12:00:00 - 17:00:00</td> 
 
    <td>12:00:00 - 16:00:00</td> 
 
    </tr> 
 

 
    <tr> 
 
    <td>32</td> 
 
    <td>11:00:00 - 19:00:00</td> 
 
    <td>11:00:00 - 13:00:00</td> 
 
    <td>10:00:00 - 15:00:00</td> 
 
    <td>12:00:00 - 17:00:00</td> 
 
    <td>12:00:00 - 16:00:00</td> 
 
    <td></td> 
 
    <td></td> 
 
    </tr> 
 
</table>

Mein Verständnis ist, dass alle Daten, Transformation oder Filterung nehmen soll Platz in den Modellen (in Übereinstimmung mit den Reglern schlank halten). Mein erster Versuch war, alle Daten abzurufen und @foreach und @while Schleifen in der Blade-Vorlage zu schreiben, aber dies führte zu einer Unordnung des Codes und ist nicht wartbar und schwer für zukünftige Zwecke zu modifizieren.

Was soll ich im Hinblick auf Best Practices tun? Einige der Optionen, die ich in Betracht gezogen habe, waren die Schaffung einer weiteren Tabelle, die mir in Zukunft Flexibilität auf Kosten der Komplexität ermöglichen könnte. Die andere Option, die ich in Betracht gezogen habe, war die Verwendung der eingebauten Methoden von Eloquent für groupBy() auf der staff_id zuerst, und erstellen Sie ein assoziatives Array mit den Daten im Format ähnlich dem, was ich in meiner Blade-Vorlage erstellen muss.

+0

Nur ein bisschen Kritik. Wenn 'hours_worked' einfach basierend auf shiftstart - shiftstart berechnet wird, sollte es keine Spalte in Ihrer Tabelle sein, da dies zu einer Aktualisierung von Anomalien führen kann. – apokryfos

Antwort

0

Die Datenbankabfrage groupBy wird wahrscheinlich nicht tun, was Sie brauchen. Ich nehme an, dass Sie eine "Staff" -Tabelle haben und diese Tabelle, die Sie in der Frage zeigen, ist eine Beziehung mit dieser Tabelle. Ich gehe auch davon aus, dass Sie ein Modell der Mitarbeiter und der damit verbundenen Beziehung definiert haben. Die Idee besteht darin, die Mitarbeiter und ihre zugehörigen Zeitplaneinträge zu sammeln und sie in einer Tabelle auszugeben.

Im Controller (oder irgendwo Sie die Daten in erhalten):

$staffData = Staff::with([ "schedule" => function ($query) { 
     $query->orderBy("day_number");  
}])->get(); 
$dayCount = $staffData->reduce(function($result, $staff) { 
     return (is_null($result) || $staff->schedule->max("day_number") > $result) ? $staff->schedule->max("day_number") : $result; 
    }); 
return view("theview", compact("staffData","dayCount")); 

Nach Ansicht:

<table style="border: 1px solid black; text-align: center"> 
    <tr> 
     <th>Staff ID</th> 
     @for ($i = 0;$i < $dayCount;$i++) 
      <th>Day {{$i}}</th> 
     @endfor 
    </tr> 

    @foreach ($staffData as $staffEntry) 
     <tr> 
      <td>{{$staffEntry->id}}</td> 
      @for ($i = 0;$i < $dayCount;$i++) 
       @php $dayEntry = $staffEntry->schedule->where("day_number",$i)->first(); @endphp 
       <td>{{$dayEntry?$dayEntry->shift_start_time:""}}-{{$dayEntry?$dayEntry->shift_end_time:""}}</td> 
      @endfor 
     </tr> 
    @endforeach 
+0

Im Moment habe ich eine einzige Tabelle mit all diesen Daten, wie oben in meiner Frage beschrieben. Soll das erste Ziel darin bestehen, diese neue Tabelle einzurichten und die Beziehung zur ursprünglichen Tabelle zu erstellen? – ugotchi

+0

Ja, normalerweise richten Sie Entitäten vor Beziehungen ein und die Tabelle, die Sie haben, sieht wie eine Beziehungstabelle aus. – apokryfos

Verwandte Themen