3

zurückgegeben Ich versuche, eine Abfrage zu erstellen, die Datensätze des Elements mit seinen Beziehungen zurückgibt. Es muss jedoch von einer zweiten Ebene Beziehung bestellt werden. Und es muss auch paginiert werden.Eloquente Abfrage, um Artikel von Second-Level-Relation

Hier sind die Modelle und Beziehungen:

class FirstModel extends Model 
{ 
    public function secondModel() 
    { 
     return $this->hasMany(SecondModel::class); 
    } 
} 

class SecondModel extends Model 
{ 
    public function firstModel() 
    { 
     return $this->belongsTo(FirstModel::class); 
    } 

    public function thirdModel() 
    { 
     return $this->belongsToMany(ThirdModel::class); 
    } 
} 

class ThirdModel extends Model 
{ 
    public function secondModel() 
    { 
     return $this->belongsToMany(SecondModel::class); 
    } 
} 

Erstes Modell eine Eins-zu viel Beziehung mit dem zweiten Modell hat (zweite Modell-Tabelle ein Feld für die erste Modell-ID hat).

Zweites Modell hat eine Viele-zu-viele-Beziehung mit Drittem Modell (unter Verwendung einer Pivot-Tabelle mit erster Modell-ID und zweiter Modell-ID).

Die gewünschte Rückgabe wäre eine Sammlung von FirstModel-Elementen, die von der ThirdModel-ID bestellt wurden.

Wie konnte ich diese Abfrage mit Eloquent oder Laravel DB Query Builder erreichen?

Vielen Dank.

+0

Wenn 'FirstModel' viele' SecondModel' hat und 'SecondModel' viele (viele-zu-viele)' ThirdModel', welche 'ThirdModel' ID soll das' FirstModel' haben? Der erste aus der ersten 'SecondModel'-Beziehung? – fubar

+0

Der mit der niedrigsten ID (wenn wir bei ASC bleiben). Die Idee ist, die Ergebnisse nach den dritten Modell-ID-Werten zu ordnen. – crabbly

Antwort

2

Um das zu erreichen, was Sie beschrieben haben, müssen Sie den Query Builder verwenden und Joins zwischen den Tabellen durchführen.

Wenn Sie dies tun, müssen Sie auch über Modelle, die Soft-Löschungen verwenden, wachsam sein und Prüfungen für gelöschte Modelle selbst mit whereNull('deleted_at')-Klauseln durchführen. Ich habe diese in meinem Beispiel kommentiert.

Ich würde geneigt sein, diese Abfrage in einen Abfragebereich zu verschieben, um Ihre Controller sauber zu halten und zukünftige Wiederverwendung zu erleichtern.

+0

Perfekt. Danke, @fubar Wenn ich groupBy benutze, erhalte ich einen Fehler. Es steht 'myDB.first_models.id 'nicht in GROUP BY'. Irgendeine Idee warum? – crabbly

+0

Ich nahm an, dass der Tabellenname für 'FirstModel'' first_models' war. Daher müssen Sie die Tabellennamen entsprechend ersetzen. – fubar

+0

Sie haben richtig angenommen. Das Problem war etwas anderes. Danke für Ihre Hilfe. – crabbly

Verwandte Themen