Laravel Eloquent: Как заказать результаты связанных моделей?

У меня есть модель под названием « Школа», и у нее много учеников .

Вот код в моей модели:

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

Я получаю всех учеников с этим кодом в своем контроллере:

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

и в перспективе:

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

Теперь я хочу заказать учеников по какой-либо области в таблице students . Как я могу это сделать?

У вас есть несколько способов добиться этого:

 // 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(); - // 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(); - // 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(); - // 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(); - // 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(); 

Чтобы ответить на исходный вопрос, динамическое свойство students также можно получить в качестве метода отношений.

Таким образом, у вас есть это, чтобы забрать всех учеников:

 $students = $school->students; 

Теперь, как метод отношений, это эквивалентно:

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

Учитывая это, теперь вы можете добавить в некоторый порядок:

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

Поскольку eloquent будет выполнять соединение, не забудьте указать имя таблицы, когда ссылаетесь на столбец для заказа.

Вы также можете добавить это к методу ваших students если хотите установить порядок по умолчанию, в который всегда будут возвращаться $school->students . Ознакомьтесь с документацией для hasMany() чтобы узнать, как это работает.

вы можете добавить orderBy к своим отношениям, поэтому единственное, что вам нужно изменить, это

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

в

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