web-dev-qa-db-fra.com

Laravel Eloquent: Comment classer les résultats des modèles associés?

J'ai un modèle appelé école et il a beaucoup étudiants .

Voici le code dans mon modèle:

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

Je reçois tous les étudiants avec ce code dans mon contrôleur:

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

et dans la vue:

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

Maintenant, je veux commander le Etudiants par un champ de la table students. Comment puis je faire ça?

15
Debiprasad

Vous avez plusieurs moyens d'y parvenir:

// 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

vous pouvez ajouter orderBy à votre relation, de sorte que la seule chose à changer est 

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

à

public function students()
{
    return $this->hasMany('Student')->orderBy('id', 'desc');
}
7
fico7489

Pour répondre à la question d'origine, vous pouvez également accéder à la propriété dynamique students en tant que méthode de relation.

Donc, vous avez ceci pour aller chercher tous les étudiants:

$students = $school->students;

Maintenant, en tant que méthode de relation, ceci est équivalent:

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

Compte tenu de cela, vous pouvez maintenant ajouter un peu de commande:

$students = $school->students()->orderBy('students.last_name')->get();

Puisque eloquent effectuera une jointure, veillez à inclure le nom de la table lors de la référence de la colonne à l'ordre.

Vous pouvez également ajouter ceci à votre méthode students si vous souhaitez définir un ordre par défaut que $school->students renverra toujours. Consultez la documentation de hasMany() pour voir comment cela fonctionne.

5
Jason

Pour plusieurs personnes à une relation, j’en trouve une sur https://laracasts.com/discuss/channels/eloquent/order-by-on-relationhip

$order = 'desc'; $users = User::join('roles', 'users.role_id', '=', 'roles.id')->orderBy('roles.label', $order)->select('users.*')->paginate(10);

cela peut sauver un jour ... de n'importe qui

0
Madhavi Khatal