我有下表:
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,如下所示:
有时虽然这个位置有7位父亲,但如果我知道父亲的数量,我可以在循环时为父亲的数字做多少但我在编译时不知道这个数字。
答案 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');
}