Deb*_*sad 21 php laravel eloquent laravel-4
我有一个名为School的模型,它有很多学生.
这是我模型中的代码:
public function students()
{
return $this->hasMany('Student');
}
Run Code Online (Sandbox Code Playgroud)
我在控制器中收到所有学生的代码:
$school = School::find($schoolId);
Run Code Online (Sandbox Code Playgroud)
并在视图中:
@foreach ($school->students as $student)
Run Code Online (Sandbox Code Playgroud)
现在我想通过表格中的某个字段订购学生students.我怎样才能做到这一点?
Jar*_*zyk 60
您有几种方法可以实现此目的:
// 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();
Run Code Online (Sandbox Code Playgroud)
fic*_*489 17
你可以为你的关系添加orderBy,所以你唯一需要改变的是
public function students()
{
return $this->hasMany('Student');
}
Run Code Online (Sandbox Code Playgroud)
至
public function students()
{
return $this->hasMany('Student')->orderBy('id', 'desc');
}
Run Code Online (Sandbox Code Playgroud)
要回答原始问题,students还可以将动态属性作为关系方法进行访问.
所以你有这个来取得所有学生:
$students = $school->students;
Run Code Online (Sandbox Code Playgroud)
现在作为一种关系方法,这是等价的:
$students = $school->students()->get();
Run Code Online (Sandbox Code Playgroud)
鉴于此,您现在可以添加一些排序:
$students = $school->students()->orderBy('students.last_name')->get();
Run Code Online (Sandbox Code Playgroud)
由于eloquent将执行连接,因此请确保在引用要排序的列时包含表名.
students如果要设置$school->students始终返回的默认顺序,也可以将其添加到方法中.查看文档hasMany()以了解其工作原理.
| 归档时间: |
|
| 查看次数: |
36823 次 |
| 最近记录: |