php Laravel返回同一表中父母的孩子

hfyxw5xn  于 2023-06-04  发布在  PHP
关注(0)|答案(3)|浏览(359)

使用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());
        });
}

表头视图

<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>
carvr3hs

carvr3hs1#

首先,你所做的是低效的。您的视图遍历每个父类别的所有子类别。如果您正确地定义了关系,并利用了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,因为父类别已经包含子类别。
现在,您只需要在视图中显示类别:

<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>
w7t8yxp5

w7t8yxp52#

我自己找到了解决办法。我必须遍历结果才能访问成员变量。

@foreach($locations as $location)
            <tr>
                <td>
                    {{$location->location_id}}
                </td>
                <td>
                    @foreach($location->members as $member)
                        {{$member->first_name}}
                    @endforeach
                </td>
                <td>

                </td>
            </tr>
        @endforeach
jc3wubiy

jc3wubiy3#

类别型号:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    protected $fillable = ['name', 'parent_id'];

    public function children()
    {
        return $this->hasMany(Category::class, 'parent_id', 'id');
    }

    public function parent()
    {
        return $this->belongsTo(Category::class, 'parent_id', 'id');
    }

    public function descendants()
    {
        return $this->children()->with('descendants');
    }
}

取树层次结构:

$categories = Category::with('descendants')->whereNull('parent_id')->get();

相关问题