【问题标题】:How to re-order an Eloquent collection?如何重新订购 Eloquent 合集?
【发布时间】:2017-05-22 12:43:21
【问题描述】:
我有一组通过关系检索到的记录,我想按created_at 字段对它们进行排序。这在 Eloquent 中可行吗?
这是我检索集合的方式:
$skills = $employee->skills;
我想通过他们的创作订购这个$skills 收藏。我试过$skills->orderBy('created_at', 'desc');,但Collection 类没有orderBy 方法。
我想这个问题很简单,我错过了一些东西..
【问题讨论】:
标签:
laravel
collections
eloquent
【解决方案1】:
您可以通过两种方式做到这一点。您可以在查询时orderBy您的结果,如
$employee->skills()->orderBy('created_at', 'desc')->get();
或
您可以在您的collection 上使用sortBy 和sortByDesc
【解决方案2】:
失败的原因是orderBy 是一个查询方法而不是一个集合方法。
如果你使用$skills = $employee->skills()->orderBy('created_at', 'desc')->get();,这将按照你想要的顺序查询技能。
或者,如果您已经有一个想要重新订购的集合,您可以使用sortBy 或sortByDesc 方法。
【解决方案3】:
您需要在查询而不是关系上添加orderBy 约束。
例如,
$employees = Employee::where('salary', '>', '50000') // just an example
->with('skills') // eager loading the relationship
->orderBy('created_at', 'desc')
->get();
然后:
foreach($employees as $employee)
{
var_dump($employee->skill);
}
【解决方案4】:
如果您希望结果始终按字段排序,您可以在关系上指定:
Employee.php
public function skills() {
return $this->hasMany(Skills::class)->orderBy('created_at');
}
如果你只是偶尔想订购它们,你可以使用orderBy(),但在关系上,而不是属性上:
$skills = $employee->skills()->orderBy('created_at')->get();
【解决方案5】:
集合有sortBy和sortByDesc
$skills = $skills->sortBy('created_at');
$skills = $skills->sortByDesc('created_at');