扁平化的嵌套关系按父级然后由子级排序-仅凭雄辩就可以吗?

时间:2018-11-28 05:01:47

标签: php laravel relationship

单独使用雄辩有可能吗?

// 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;
}

很好奇,因为尽管按照我希望的方式进行了工作,但我想知道框架功能中是否已经存在更好的解决方案。

1 个答案:

答案 0 :(得分:0)

类似的事情可以在SQL中使用:

<mat-form-field>
  <mat-icon matSuffix>search</mat-icon>
  <input [formControl]="selectedOption"
         placeholder="Select and Option"
         matInput
         [matAutocompleteDisabled]="disablePanel"
         [matAutocomplete]="auto">
  <mat-autocomplete #auto="matAutocomplete" [displayWith]="displayFn">
    <mat-option *ngFor="let option of filteredOptions " [value]="option">
      {{option.name}}
    </mat-option>
  </mat-autocomplete>
</mat-form-field>

即如果没有parent_id,则select t.* from t order by coalesce(t.parent_id, t.id), `order` ; 函数将使用id。这样可以将父母和子女的家庭“聚在一起”,然后家庭中的行可以使用“订单”列。

虽然我对Laravel不熟悉,但我相信可以像这样使用orderByRaw

coalesce

另请参见this answer

如果使用orderByRaw('coalesce(parent_id, id), `order`') 函数存在问题,则可以在SQL中使用此替代方法:

coalesce

select t.* from t order by case when t.parent_id IS NULL THEN t.id else t.parent_id end, t.`order` ; 可以转换成case expression供我怀疑的Laravel使用。