У меня есть модель под названием « Школа», и у нее много учеников .
Вот код в моей модели:
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') }