Ich habe ein Modell namens School und es hat viele Studenten .
Hier ist der Code in meinem Modell:
public function students()
{
return $this->hasMany('Student');
}
Ich bekomme alle Schüler mit diesem Code in meinem Controller:
$school = School::find($schoolId);
und in der Ansicht:
@foreach ($school->students as $student)
Nun möchte ich das Students durch ein Feld in der students
-Tabelle bestellen. Wie kann ich das machen?
Sie haben mehrere 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();
sie können Ihrer Beziehung orderBy hinzufügen. Sie müssen also nur noch etwas ändern
public function students()
{
return $this->hasMany('Student');
}
zu
public function students()
{
return $this->hasMany('Student')->orderBy('id', 'desc');
}
Um die ursprüngliche Frage zu beantworten, kann auf die dynamische Eigenschaft students
auch als Beziehungsmethode zugegriffen werden.
So haben Sie das, um alle Schüler zu holen:
$students = $school->students;
Dies ist nun als Beziehungsmethode gleichwertig:
$students = $school->students()->get();
In Anbetracht dessen können Sie jetzt in der Reihenfolge hinzufügen:
$students = $school->students()->orderBy('students.last_name')->get();
Da eloquent einen Join ausführt, muss der Tabellenname beim Verweisen auf die Spalte mit angegeben werden.
Sie können dies auch Ihrer students
-Methode hinzufügen, wenn Sie eine Standardreihenfolge festlegen möchten, die $school->students
immer zurückgibt. Lesen Sie die Dokumentation zu hasMany()
, um zu erfahren, wie dies funktioniert.
Für viele zu einer Beziehung stelle ich eine Person auf https://laracasts.com/discuss/channels/eloquent/order-by-on-relationship
$order = 'desc';
$users = User::join('roles', 'users.role_id', '=', 'roles.id')->orderBy('roles.label', $order)->select('users.*')->paginate(10);
das kann den Tag retten
Sie können dies wie folgt verwenden:
$students = $school->students()->orderBy('id', 'desc');
Sie können auch verwenden
$students = $school->students()->orderBy('id', 'desc')->paginate(10);