Foreach ul li是一个无限的条件

时间:2017-10-17 19:57:57

标签: laravel loops for-loop

我有下表:

public function up()
{
    Schema::create('locations', function (Blueprint $table) {
        $table->increments('id');
        $table->string('location_name',50);
        $table->integer('location_id')->unsigned();
        $table->foreign('location_id')->references('id')->on('locations');          
        $table->softDeletes();
        $table->timestamps();
    });
}

我希望它看起来像一棵树,但仍然可以在我的ul li下拉列表中使用它。 在我的刀片里面,我做到了这一点:

                    <ol>
                        @foreach($locations->where('location_id','=',null) as $location)
                            <li draggable='true'>
                                {{$location->location_name}}
                                <ol>
                                @foreach($location->get_sub as $location_sub)
                                    <li draggable='true'>{{$location_sub->location_name}}</li>
                                @endforeach
                                </ol>
                            </li>
                        @endforeach
                    </ol>

$ location-&gt; get_sub是模型中的函数 为了关系

public function get_sub()
{
    return $this->hasMany('App\Location','location_id','id');
}

通过这样做,我可以到达父/子位置;然而,有时我需要父母的孩子的曾孙子等元素。 我的想法是做一个while循环来查找每个子位置 并将它们放在ul li列表中,并将每个get_sub显示在它下面,并在父ul ul中显示ul li,如下所示:

enter image description here

有时虽然这个位置有7位父亲,但如果我知道父亲的数量,我可以在循环时为父亲的数字做多少但我在编译时不知道这个数字。

1 个答案:

答案 0 :(得分:2)

你的模特怎么称呼?让我们假设它的名字是Location。将您的关系名称添加到位置模型中的$ with属性:

protected $with = ['get_sub'];

在您的控制器中(或您在任何地方),您可以致电:

$locations = Location::get();

你会得到那个嵌套列表。但是如果你的名单增长太多,要小心。每次从db获取位置时,它都会带有所有的子节点。因此,请检查您是否可以从$ with array中动态添加或删除'get_sub'项。

要从子项开始,您需要在Location模型中定义parent()方法,并将其添加到$ with数组中。

protected $with = ['parent'];

public function parent()
{
    return $this->belongsTo('App\Location', 'location_id', 'id');
}