gpt4 book ai didi

php - Laravel 在同一张表中返回 parent 的 child

转载 作者:可可西里 更新时间:2023-10-31 22:41:32 24 4
gpt4 key购买 nike

使用 Laravel 5.1,我正在尝试从 MySQL 类别表创建菜单列表。我的服务提供商返回数据,但我不明白如何在 foreach 循环中创建子类别。当我执行循环时,只返回子查询的最后一行。任何指导将不胜感激。

类别表

id  | cat_name      | cat_parent_id
--- | --------------| -------------
1 | Parent Cat 1 | NULL
2 | Parent Cat 2 | NULL
3 | Child Cat 1 | 2
4 | Child Cat 2 | 2
5 | Parent Cat 3 | NULL
6 | Child Cat 3 | 5

期望的结果

Parent Cat 1
Parent Cat 2
Child Cat 1
Child Cat 2
Parent Cat 3
Child Cat 3

viewComposerServiceProvider.php

public function boot()
{
$this->composeTopCategoryNavigation();
$this->composeSubCategoryNavigation();
}

private function composeTopCategoryNavigation()
{
view()->composer('partials.header', function($view)
{
$view->with('top_cats', Category::whereNull('cat_parent_id')->orderBy('cat_name', 'asc')->get());
});
}

private function composeSubCategoryNavigation()
{
view()->composer('partials.header', function($view)
{
$view->with('sub_cats', Category::whereNotNull('cat_parent_id')->orderBy('cat_name', 'asc')->get());
});
}

标题 View

<ul>
@foreach ($top_cats as $top_cat)
<?php $top_cat_slug = str_slug( $top_cat->cat_name, "-"); ?>
<li>{{ $top_cat->cat_name }}
@foreach ($sub_cats as $sub_cat)
@if ( $sub_cat->cat_parent_id === $top_cat->id )
<ul>
<li{{ $sub_cat->cat_name }}</li>
</ul>
@endif
@endforeach
</li>
@endforeach
</ul>

最佳答案

首先,你做的事情效率低下。您的 View 遍历每个父类别的所有子类别。如果您正确定义关系并利用 Eloquent 的预先加载,您可以更轻松地获取和访问子类别。

从定义关系开始:

class Category extends Model {
//each category might have one parent
public function parent() {
return $this->belongsToOne(static::class, 'cat_parent_id');
}

//each category might have multiple children
public function children() {
return $this->hasMany(static::class, 'cat_parent_id')->orderBy('cat_name', 'asc');
}
}

一旦正确定义了关系,就可以像下面这样获取整个类别树:

view()->composer('partials.header', function($view) {
$view->with('categories', Category::with('children')->whereNull('cat_parent_id')->orderBy('cat_name', 'asc')->get());
});

不需要第二个 Composer ,因为父类别已经包含子类别。

现在,您只需要在 View 中显示类别:

<ul>
@foreach ($categories as $parent)
<li>{{ $parent->cat_name }}
@if ($parent->children->count())
<ul>
@foreach ($parent->children as $child)
<li>{{ $child->cat_name }}</li>
@endforeach
</ul>
@endif
</li>
@endforeach
</ul>

关于php - Laravel 在同一张表中返回 parent 的 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32122849/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com