2014-09-06 6 views
10

Ich habe ein Modell namens Schule und es hat viele Studenten. HierLaravel Eloquent: Wie man Ergebnisse von verwandten Modellen bestellt?

ist der Code in meinem Modell:

public function students() 
{ 
    return $this->hasMany('Student'); 
} 

ich alle Studenten mit diesem Code in meinem Controller bin immer:

$school = School::find($schoolId); 

und in der Ansicht:

@foreach ($school->students as $student) 

Jetzt möchte ich die Studenten von einem Feld in derbestellenTabelle. Wie kann ich das machen?

+0

@JaredFarrish orderBy es würde Abfrage auf der 'schools' Tabelle beeinflussen, nicht 'Studenten', und offensichtlich würde einen Fehler werfen, es sei denn, Sie schließen sich den Tischen an. –

Antwort

26

Sie haben ein paar Möglichkeiten, dies zu erreichen:

// when eager loading 
$school = School::with(['students' => function ($q) { 
    $q->orderBy('whateverField', 'asc/desc'); 
}])->find($schoolId); 

// when lazy loading 
$school = School::find($schoolId); 
$school->load(['students' => function ($q) { 
    $q->orderBy('whateverField', 'asc/desc'); 
}]); 

// or on the collection 
$school = School::find($schoolId); 
// asc 
$school->students->sortBy('whateverProperty'); 
// desc 
$school->students->sortByDesc('whateverProperty'); 


// or querying students directly 
$students = Student::whereHas('school', function ($q) use ($schoolId) { 
    $q->where('id', $schoolId); 
})->orderBy('whateverField')->get(); 
+0

Sortieren von Sammlungen nach mehreren Eigenschaften des Modells? Zum Beispiel möchte ich nach Klasse und dann nach ihrem Namen sortieren. '$ school-> students-> sortBy ('whateverProperty') -> sortBy ('anotherProperty');' funktioniert nicht. Es sortiert nur die Sammlung nach "anotherProperty". – Debiprasad

+0

Hier ist eine Lösung, die funktioniert. Es benutzt den Verschluss. http://StackOverflow.com/a/25451441/225790 – Debiprasad

+0

Ja, Mark Baker's verknüpfte Lösung ist ordentlich. Eine andere Lösung wäre 'usort'. –

3

die ursprüngliche Frage zu beantworten, die students dynamische Eigenschaft kann auch als eine Beziehung Methode zugegriffen werden.

So haben Sie diese alle Schüler zu holen:

$students = $school->students; 

nun als eine Beziehung Methode, dies entspricht:

$students = $school->students()->get(); 

dies gegeben, können Sie jetzt in einigen Bestellung hinzufügen:

Da eloquent einen Join ausführen wird, achten Sie darauf, den Tabellennamen bei referenc anzugeben die Spalte nach Reihenfolge sortieren.

Sie können dies auch zu Ihrer -Methode hinzufügen, wenn Sie eine Standardreihenfolge festlegen möchten, die immer $school->students zurückgibt. Lesen Sie in der Dokumentation zu hasMany() nach, wie das funktioniert.

0

Sie können orderBy auf Ihre Beziehung hinzufügen, so das einzige, was müssen Sie ist ändern

public function students() 
{ 
    return $this->hasMany('Student'); 
} 

zu

public function students() 
{ 
    return $this->hasMany('Student')->orderBy('id', 'desc') 
} 
Verwandte Themen