Laravel Eloquent:如何订购相关模型的结果?

时间:2014-09-06 12:59:27

标签: php laravel laravel-4 eloquent

我有一个名为学校的模型,它有很多学生

以下是我模型中的代码:

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

我正在让所有学生在我的控制器中使用此代码:

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

并在视图中:

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

现在我想按students表中的某个字段订购学生。我怎么能这样做?

5 个答案:

答案 0 :(得分:45)

您有几种方法可以实现这一目标:

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

答案 1 :(得分:13)

您可以将orderBy添加到您的关系中,因此您唯一需要更改的是

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

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

答案 2 :(得分:7)

要回答原始问题,还可以将students动态属性作为关系方法进行访问。

所以你有这个来取得所有学生:

$students = $school->students;

现在作为一种关系方法,这是等价的:

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

鉴于此,您现在可以添加一些顺序:

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

由于eloquent将执行连接,因此请确保在引用要排序的列时包含表名。

如果您要设置students将始终返回的默认订单,您也可以将其添加到$school->students方法中。查看hasMany()的文档,了解其工作原理。

答案 3 :(得分:0)

我发现一对多的关系 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);

这可以节省任何人的一天...

答案 4 :(得分:0)

您可以这样使用:

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

您也可以使用

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