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循环。^这是调整查询逻辑的一个公平点,我只是调整了当前的解决方案以提高效率。如果所有的阶段都被加载,那么直接查询命令、连接和通过阶段排序应该是一样的。如果你有时间的话,我会加上这句话作为回答:)