Laravel returning children of parents in same table(Laravel 在同一个表中返回父母的孩子)
问题描述
使用 Laravel 5.1,我尝试从 MySQL 类别表创建菜单列表.我的服务提供者返回数据,但我不明白如何在 foreach 循环中创建子类别.当我执行循环时,只返回子查询的最后一行.任何指导将不胜感激.
Using Laravel 5.1, I am trying to create a menu list from a MySQL categories table. My service provider returns data, but I don't understand how to create the child categories in a foreach loop. When I perform the loop, only the last row of the child query is returned. Any guidance would be appreciated.
类别表
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());
});
}
标题视图
<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>
推荐答案
首先,你的做法是低效的.您的视图遍历每个父类别的所有子类别.如果您正确定义关系并利用 Eloquent 的预先加载,您可以更轻松地获取和访问子类别.
First of all, what you are doing is inefficient. Your view iterates through all subcategories for every parent category. If you defined relations properly and made use of Eloquent's eager loading, you could fetch and access child categories in easier way.
从定义关系开始:
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');
}
}
一旦您正确定义了关系,您就可以获取整个类别树,如下所示:
Once you have the relations defined properly, you can fetch whole category tree like below:
view()->composer('partials.header', function($view) {
$view->with('categories', Category::with('children')->whereNull('cat_parent_id')->orderBy('cat_name', 'asc')->get());
});
不需要第二个作曲家,因为父类别已经包含子类别.
The second composer won't be needed, as parent categories already contain children.
现在,您只需要在视图中显示类别:
Now, you only need to display the categories in your 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>
这篇关于Laravel 在同一个表中返回父母的孩子的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Laravel 在同一个表中返回父母的孩子
基础教程推荐
- 在 CakePHP 2.0 中使用 Html Helper 时未定义的变量 2021-01-01
- 找不到类“AppHttpControllersDB",我也无法使用新模型 2022-01-01
- 如何在 XAMPP 上启用 mysqli? 2021-01-01
- 使用 PDO 转义列名 2021-01-01
- phpmyadmin 错误“#1062 - 密钥 1 的重复条目‘1’" 2022-01-01
- Doctrine 2 - 在多对多关系中记录更改 2022-01-01
- 在 yii2 中迁移时出现异常“找不到驱动程序" 2022-01-01
- 如何在 Symfony 和 Doctrine 中实现多对多和一对多? 2022-01-01
- HTTP 与 FTP 上传 2021-01-01
- PHP 守护进程/worker 环境 2022-01-01