2014-09-06 116 views
10

我有一个模型叫学校它有很多学生Laravel雄辩:如何订购相关模型的结果?

这里是我的模型代码:

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

我让所有的学生与此代码在我的控制器:

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

,并在视图:

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

现在我想订购学生由中的一些字段表。我怎样才能做到这一点?

+0

@JaredFarrish排序依据也就影响到'schools'表查询,不'学生',显然会抛出一个错误,除非你加入表格。 – 2014-09-06 14:13:34

回答

26

你实现这一目标的几种方法:

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

如何通过模型的多个属性对集合进行排序?例如,我想按照课程,然后按他们的名字排序。 '$ school-> students-> sortBy('whateverProperty') - > sortBy('anotherProperty');'不起作用。它只按'anotherProperty'排序集合。 – Debiprasad 2014-09-07 12:14:19

+0

这是一个有效的解决方案。它使用闭包。 http://stackoverflow.com/a/25451441/225790 – Debiprasad 2014-09-07 12:40:10

+0

是的,马克贝克的链接解决方案是整洁的。另一个解决方案是'usort'。 – 2014-09-07 13:41:59

3

要回答原来的问题,students动态属性,也可以作为关系方法来访问。

所以,你有这个获取所有学生:

$students = $school->students; 

现在,作为一个关系法,这相当于:

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

鉴于此,你现在可以添加一些排序:

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

由于雄辩会执行连接,请确保在引用时包含表名按列排序。

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

0

您可以添加排序依据你的关系,所以你需要改变的唯一事情是

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

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