Php Laravel雄辩:如何对相关模型的结果排序?

Php Laravel雄辩:如何对相关模型的结果排序?,php,laravel,laravel-4,eloquent,Php,Laravel,Laravel 4,Eloquent,我有一个叫做学校的模型,它有很多学生 以下是我的模型中的代码: public function students() { return $this->hasMany('Student'); } 我让所有学生在我的控制器中使用以下代码: $school = School::find($schoolId); 并且认为: @foreach ($school->students as $student) 现在我想按学生表中的某个字段对学生进行排序。我如何才能做到这一点?您有几种

我有一个叫做学校的模型,它有很多学生

以下是我的模型中的代码:

public function students()
{
    return $this->hasMany('Student');
}
我让所有学生在我的控制器中使用以下代码:

$school = School::find($schoolId);
并且认为:

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

现在我想按
学生
表中的某个字段对学生进行排序。我如何才能做到这一点?

您有几种方法可以做到这一点:

// 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 = $school->students;
现在,作为关系方法,这是等效的:

$students = $school->students()->get();
鉴于此,您现在可以添加一些排序:

$students = $school->students()->orderBy('students.last_name')->get();
由于eloquent将执行联接,请确保在引用要排序的列时包含表名


如果您想设置一个默认顺序,使
$school->students
始终返回,您还可以将其添加到
students
方法中。查看
hasMany()
的文档,了解其工作原理。

您可以将orderBy添加到您的关系中,因此您只需更改

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


对于多对一关系,我在以下方面找到了一个答案:


这可以节省时间。。。任何人

都可以这样使用:

$students = $school->students()->orderBy('id', 'desc');
你也可以使用

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

@JaredFarrish orderBy there会影响对
学校
表的查询,而不是
学生
,并且显然会抛出错误,除非您加入表。如何根据模型的多个属性对集合进行排序?例如,我想按类排序,然后按名称排序<代码>$school->students->sortBy('whateverProperty')->sortBy('anotherProperty')不起作用。它只按“anotherProperty”对集合进行排序。下面是一个有效的解决方案。它使用闭包。是的,马克·贝克的链接解决方案很简洁。另一个解决方案是,
usort
@SajeebAhamed
xToOne
对相关模型进行排序没有意义,那么您的问题是什么呢?sortBy对我来说很完美,仍然不需要使用join。。。唯一让我担心的是,我正在做的是在最好的答案前的观点。我的IDE说orderBy不是hasMany的方法,但遗憾的是,它仍然有效。谢谢你给我这个最容易理解的答案。谢谢。最好的答案,因为它不会改变最初的顺序。谢谢
$students = $school->students()->orderBy('id', 'desc');
$students = $school->students()->orderBy('id', 'desc')->paginate(10);