webentwicklung-frage-antwort-db.com.de

Laravel Eloquent: Wie bestelle ich die Ergebnisse verwandter Modelle?

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?

15
Debiprasad

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();
37
Jarek Tkaczyk

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');
}
7
fico7489

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.

5
Jason

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

0
Madhavi Khatal

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);
0
FaridLU