2016-04-04 13 views
1

Ich arbeite mit einer Datentabelle, die ich aus verschiedenen Beziehungen herausgebe.Laravel 4.2 Nach Eloquent-Beziehungsproblemen sortieren

Die meisten Daten stammen aus einer meters Tabelle, die ein Meter Modell hat, aber einige davon wird aus anderen Tabellen über Beziehungen gezogen. Zum Beispiel habe ich ein Problem mit der Sortierung nach der calibrations Tabelle.

Die Datentabelle hat sortierbare Spalten, die gut funktionieren. In den Spalten, die auf anderen Beziehungen basieren, sind die Verknüpfungen vorhanden, sodass sie ohne Abfragefehler sortiert werden.

Alle Sortierung und Verbindungen funktionieren bis auf eine, last_calibration_date.

Es gibt keine Spalte mit der Bezeichnung last_calibration_date. In der Tat könnte jeder meter mehrere Kalibrierungen haben.

Im Meter Modell packe ich die last_calibration_date vom calibrations Tabelle über die calibration_date Spalte auf diese Weise:

public function getLastCalibrationDateAttribute() 
{ 
    if (isset($this->relations['calibrations']) && $this->relations['calibrations']->count()) 
     return $this->relations['calibrations']->sortBy('calibration_date', SORT_REGULAR, true)->first()->calibration_date->format('Y-m-d'); 
} 

Das funktioniert hervorragend, wenn ich nicht von der last_calibration_date Spalte sortiert wird, sondern gibt einen SQL-Fehler, wenn Sie versuchen, ohne Join danach zu sortieren.

Hier ist mein Versuch an der Verbindung:

if ($sort == 'last_calibration_date') 
{ 
    $query->join('calibrations', 'calibrations.meter_id', '=', 'meters.id'); 
    $sort = 'calibrations.calibration_date'; 
} 

Während dies keinen Fehler zurückgibt es auch nicht die tatsächlichen last_calibration_date zurück.

Nur ein wenig mehr Informationen, die calibrations Tisch eingerichtet ist, wie so

calibrations 
- id 
- calibration_date 
- next_calibration_date 
- meter_id 

So, wie bereits gesagt wurde, jeder Meter mehrere Kalibrierungen haben.

Irgendwelche Ideen, wie ich meine Meter Methode in meinem Beitritt replizieren könnte? Oder vielleicht eine andere Art der Sortierung nach last_calibration_date?

+0

Upgrade auf 5.2, Sie sind in der Vergangenheit! –

+0

Würde immer noch die gleichen Probleme haben. – cookavich

+0

TBH mit DB :: roh dafür wird weniger Kopfschmerzen für Sie sein. –

Antwort

1

Alrighty, nun, ich habe mein Problem gelöst, ohne zu verstehen warum.

if ($sort == 'last_calibration_date') 
{ 
    $query->select('meters.*'); 
    $query->join('calibrations as calibration', 'calibration.meter_id', '=', 'meters.id'); 
    $sort = 'calibration.calibration_date'; 
} 

Hinzufügen, dass $query->select('meters.*'); es gelöst hat. Nochmal nicht sicher warum. Mein Verständnis ist, dass die Spalten einer bestimmten Tabelle ausgewählt werden, nicht die Beziehungen eines Modells.

Wie auch immer, es funktioniert jetzt.