laravel 如何重新订购Eloquent系列?

eagi6jfj  于 2023-01-21  发布在  其他
关注(0)|答案(6)|浏览(115)

我有一个通过关系检索到的记录集合,我想按created_at字段对它们进行排序。这在Eloquent中可行吗?
下面是我如何检索集合:
$skills = $employee->skills;
我想按创建顺序排列此$skills集合。我尝试过$skills->orderBy('created_at', 'desc');,但Collection类没有orderBy方法。
我想这道题很简单,但我漏掉了一些东西。

egdjgwm8

egdjgwm81#

您可以通过两种方式来实现这一点。您可以在查询时orderBy您的结果,例如

$employee->skills()->orderBy('created_at', 'desc')->get();
    • 或**

您可以在collection上使用sortBysortByDesc

wmomyfyw

wmomyfyw2#

失败的原因是orderBy是查询方法,而不是收集方法。
如果您使用$skills = $employee->skills()->orderBy('created_at', 'desc')->get();,这将按照您想要的顺序查询技能。
或者,如果您已经有了一个要重新排序的集合,则可以使用sortBysortByDesc方法。

2skhul33

2skhul333#

您需要在查询上而不是在关系上添加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);
}
q5lcpyga

q5lcpyga4#

如果希望结果总是按字段排序,可以在关系中指定:

雇员.php

public function skills() {
    return $this->hasMany(Skills::class)->orderBy('created_at');
}

如果你有时候只是想对它们进行排序,你可以使用orderBy(),但是是在关系上,而不是在属性上:

$skills = $employee->skills()->orderBy('created_at')->get();
rpppsulh

rpppsulh5#

集合包含sortBysortByDesc

$skills = $skills->sortBy('created_at');
$skills = $skills->sortByDesc('created_at');
xtfmy6hx

xtfmy6hx6#

这个Stackoverflow问题询问如何订购Eloquent集合。但是,我想提出一个不同的解决方案来代替问题中的示例。我想推荐给use an ordering on the query itself for performance reasons
就像@ Don 't Panic建议的那样,您可以为关系指定一个默认顺序,以获得更大的重用性便利:
app/Models/Employee.php

public function skills() {
    return $this->hasMany(Skills::class)->orderBy('created_at');
}

然而,如果你已经像上面的代码那样对你的查询设置了一个排序,那么任何额外的排序都将被忽略。所以,如果你想在另一种情况下使用不同的排序,那就很麻烦了。要覆盖这个默认的排序并用一个新的排序对查询重新排序,你需要使用reorder()方法。例如:

// Get a Collections of Skill-models ordered by the oldest skill first.
$skills = $employee->skills()->reorder()->orderByDesc('created_at')->get();

// Same result as the previous example, but different syntax.
$skills = $employee->skills()->reorder()->oldest()->get();

// Or just give some arguments to the reorder() method directly:
$skills = $employee->skills()->reorder('created_at', 'desc')->get();

相关问题