Schoolというモデルがあり、多くのStudentsがあります。
モデルのコードは次のとおりです。
public function students()
{
return $this->hasMany('Student');
}
私のコントローラーでこのコードを使用してすべての学生を取得しています:
$school = School::find($schoolId);
ビューで:
@foreach ($school->students as $student)
ここで、students
テーブルのいくつかのフィールドで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();
リレーションにorderByを追加できるので、変更する必要があるのは
public function students()
{
return $this->hasMany('Student');
}
に
public function students()
{
return $this->hasMany('Student')->orderBy('id', 'desc');
}
元の質問に答えるために、students
動的プロパティに関係メソッドとしてアクセスすることもできます。
すべての生徒を取得するためにこれがあります:
_$students = $school->students;
_
関係メソッドとして、これは同等です:
_$students = $school->students()->get();
_
これにより、次の順序で追加できます。
_$students = $school->students()->orderBy('students.last_name')->get();
_
Eloquentは結合を実行するため、順序付けする列を参照するときにテーブル名を含めるようにしてください。
_$school->students
_が常に返すデフォルトの順序を設定する場合は、students
メソッドにこれを追加することもできます。 hasMany()
のドキュメントを参照して、これがどのように機能するかを確認してください。
多対一の関係について、私は1つの答えを見つけました:
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);
これは誰の日も節約できます...
これは次のように使用できます。
$students = $school->students()->orderBy('id', 'desc');
使用することもできます
$students = $school->students()->orderBy('id', 'desc')->paginate(10);