按父母和孩子排序的扁平嵌套关系——单凭雄辩是否可能



这是否可能单独使用雄辩:

// build doc tree
public function tree()
{
$docs = app(config('lap.model.doc'))->with(['children.parent', 'children' => function ($query) {
return $query->orderBy('order');
}])->whereNull('parent_id')->orderBy('order')->get()->toArray();
$docs_array = [];
foreach ($docs as $doc)
{
$docs_array[] = array_except($doc, 'children');
if ($doc['children']) {
foreach ($doc['children'] as $child) {
$docs_array[] = $child;
}
}
}
return $docs_array;
}

只是很好奇,因为尽管这是我想要的方式,但我想知道在框架能力范围内是否已经存在更好的解决方案。

类似的东西可以在SQL:中使用

select t.*
from t
order by coalesce(t.parent_id, t.id), `order`
;

即CCD_ 1函数在不存在parent_。这将父族和子族"聚集"在一起,然后族中的行可以使用"顺序"列。

虽然我对Laravel不熟悉,但我相信orderByRaw可能会被使用,比如:

orderByRaw('coalesce(parent_id, id), `order`')

另请参阅此答案

如果使用coalesce函数是个问题,则可以在SQL:中使用此选项

select t.*
from t
order by case when t.parent_id IS NULL THEN t.id else t.parent_id end, t.`order`
;

并且CCD_ 3可以被转换成CCD_。

最新更新