显示父页面 > 子页面以及子页面的刀片递归视图

问题描述

很难在标题中描述这一点,所以这张图片可能会澄清:

Multi select dropdown

我有一个递归视图,输出上述内容

@foreach($pages as $page)
    <option value="{{$page->id}}"
            @if($selected == $page->id) selected @endif
    >@for($i=0; $i<$levels; $i++)&#8618;@endfor {{$page->title}} (#{{$page->id}})
    </option>

    @if($page->children->count())
        @include('cms::admin.partials.page-selector-option',['pages' => $page->children,'levels' => $levels + 1])
    @endif
@endforeach

假设一个页面具有以下列:

问题在于传递给此视图的页面集合,例如:

$pages = Page::where('template_id',10)->get()

包含一个带有“test subcat”子页面页面,该页面正确地作为子页面输出,但它也包含子页面本身作为下面的新项目输出(参见屏幕截图中加载的两个#54页面) .

做这样的事情:

$pages = Page::where('template_id',10)->where('parent_id',0)->get()

有帮助,但是我仍然想在此处显示不一定是顶级页面页面,因此 parent_id 可能不是 0。

我认为我需要做的是查询 parent() 关系以查看 parent_id 是否具有相同的 template_id,如果是,则不返回此项目。以下是我到目前为止不起作用的内容

  public function scopeWithoutChildren($query)
    {
        return $query->with(
            [
                'parent' => function ($q) {
                    $q->where('template_id','!=',10);
                }
            ]);
    }

解决方法

我已经修好了

public function scopeWithoutChildren($query)
    {
        return $query->whereHas('parent',function ($query) {
            return $query->where('parent_id','pages.parent_id');
        });
    }