Laravel |基于轴按顺序返回行
我有以下设置: 阶段:Laravel |基于轴按顺序返回行,laravel,eloquent,Laravel,Eloquent,我有以下设置: 阶段: | id | name | order | 命令: | id | name | body | ------------------------------= | 1 | test | phpunit | | 2 | style | echo "style" | | 3 | deploy | deploy | 命令(u)阶段: | command_id | stage_id | order | --
| id | name | order |
命令:
| id | name | body |
------------------------------=
| 1 | test | phpunit |
| 2 | style | echo "style" |
| 3 | deploy | deploy |
命令(u)阶段:
| command_id | stage_id | order |
---------------------------------
| 1 | 1 | 1 |
| 2 | 2 | 1 |
| 3 | 1 | 2 |
基本上,我想在stage模型上创建一个方法,它允许我根据顺序返回所有命令,但是命令有一个特定的顺序,stage也有一个特定的顺序
因此,每个命令都存储在一个阶段下,因此我们知道运行哪个部分,但每个命令在该阶段中也有一个顺序。现在我知道我可以做如下事情:
$inOrder = collect();
Stage::get()->each(function ($stage) {
$commands = $stage->commands()->orderByPivot('order')->get();
$inOrder->push($commands);
});
return $inOrder;
但我想知道有没有更好的方法?甚至是一种仅在一次数据库命中时执行此操作的方法?预加载并排序关系:
$stages = Stage::with(['commands' => function ($subQuery) {
$subQuery->orderBy('command_stage', 'order');
}])->get();
foreach($stages as $stage) {
$inOrder->push($stage->commands);
}
这种快速加载的方法将减少在
foreach()
循环中执行$stage->commands()
的N+1查询问题。这看起来不错,但是为什么不直接查询命令,先按阶段进行一次排序,然后按顺序进行二次排序呢,通过这种方式,您可以直接获得已排序的集合,而不必执行foreach循环。^这是调整查询逻辑的一个公平点,我只是调整了当前的解决方案以提高效率。如果所有的阶段都被加载,那么直接查询命令、连接和通过阶段排序应该是一样的。如果你有时间的话,我会加上这句话作为回答:)