web-dev-qa-db-ja.com

Laravel Eloquent:関連モデルの結果を注文する方法は?

Schoolというモデルがあり、多くのStudentsがあります。

モデルのコードは次のとおりです。

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

私のコントローラーでこのコードを使用してすべての学生を取得しています:

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

ビューで:

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

ここで、studentsテーブルのいくつかのフィールドでStudentsを並べたいと思います。どうやってやるの?

21
Debiprasad

これを達成するにはいくつかの方法があります。

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

リレーションにorderByを追加できるので、変更する必要があるのは

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

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

元の質問に答えるために、students動的プロパティに関係メソッドとしてアクセスすることもできます。

すべての生徒を取得するためにこれがあります:

_$students = $school->students;
_

関係メソッドとして、これは同等です:

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

これにより、次の順序で追加できます。

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

Eloquentは結合を実行するため、順序付けする列を参照するときにテーブル名を含めるようにしてください。

_$school->students_が常に返すデフォルトの順序を設定する場合は、studentsメソッドにこれを追加することもできます。 hasMany()のドキュメントを参照して、これがどのように機能するかを確認してください。

7
Jason

多対一の関係について、私は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);

これは誰の日も節約できます...

0
Madhavi Khatal

これは次のように使用できます。

$students = $school->students()->orderBy('id', 'desc');

使用することもできます

$students = $school->students()->orderBy('id', 'desc')->paginate(10);
0
FaridLU