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?
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();
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');
}
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.
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