当前位置:首页 > CMS教程 > 其它CMS > 列表

如何使用Laravel Eloquent来开发无限极分类

发布:smiling 来源: PHP粉丝网  添加日期:2022-05-02 12:32:01 浏览: 评论:0 

在网上商城上,我们经常可以看到多级分类、子分类、甚至无限极分类,本文将向你展示如何优雅的通过 Laravel Eloquent 将其实现。

概述

我们会创建一个微型项目来展示儿童商店的分类,总共有 5 级,如下:

如何使用Laravel Eloquent来开发无限极分类

数据库迁移

简单的数据表结构:

  1. Schema::create('categories'function (Blueprint $table) { 
  2.  $table->bigIncrements('id'); 
  3.  $table->string('name'); 
  4.  $table->unsignedBigInteger('category_id')->nullable(); 
  5.  $table->foreign('category_id')->references('id')->on('categories'); 
  6.  $table->timestamps(); 
  7. }); 

只有一个 name 字段, 关联到其自身,所以,大部分父级分类 category_id = NULL,每一个子分类都有一个 parent_id。

数据表数据如下:

如何使用Laravel Eloquent来开发无限极分类

Eloquent 模型和关联关系

首先,在 app/Category.php 创建一个简单的 hasMany() 方法, 分类可能拥有其自分类:

  1. class Category extends Model 
  2.  public function categories() 
  3.  { 
  4.  return $this->hasMany(Category::class); 
  5.  } 

好戏开场 本文最妙 “计策”,你知道可以向这样描述 递归 关系吗?如下:

  1. public function childrenCategories() 
  2.  return $this->hasMany(Category::class)->with('categories'); 

因此,如果调用 Category::with(‘categories'),将得到下级 “子分类”,但是通过 Category::with(‘childrenCategories') 将能帮你实现无限极。

路由和控制器方法

现在,让我们尝试显示所有类别和子类别,如上例所示。

在 routes/web.php,我们添加以下内容:

Route::get('categories', 'CategoryController@index');

app/Http/CategoryController.php 如下所示:

  1. public function index() 
  2.  $categories = Category::whereNull('category_id'
  3.  ->with('childrenCategories'
  4.  ->get(); 
  5.  return view('categories', compact('categories')); 

我们仅加载父类别,将子类别作为关系,简单吧?

视图和递归子视图

最后,渲染到页面,在 resources/views/categories.blade.php 文件:

  1. <ul> 
  2.  @foreach ($categories as $category) 
  3.  <li>{{ $category->name }}</li> 
  4.  <ul> 
  5.  @foreach ($category->childrenCategories as $childCategory) 
  6.  @include('child_category', ['child_category' => $childCategory]) 
  7.  @endforeach 
  8.  </ul> 
  9.  @endforeach 
  10. </ul> 

我们先遍历了最顶级的父类别,然后遍历出父类的子类别,然后使用 @include 加载子类别的子类别......

最好的部分是 resources/views/admin/child_category.blade.php 将使用递归加载自身,看代码:

  1. <li>{{ $child_category->name }}</li> 
  2. @if ($child_category->categories) 
  3.  <ul> 
  4.  @foreach ($child_category->categories as $childCategory
  5.  @include('child_category', ['child_category' => $childCategory]) 
  6.  @endforeach 
  7.  </ul> 
  8. @endif 

在 child_category.blade.php 内部,我们包含了 @include(‘child_category'),因此只要当前子类别中有类别,模板就会递归地加载子类别。

就是这样!我们拥有无限级别的子类别 - 无论是在数据库还是关联关系或是视图中。

Tags: Laravel无限极分类 Eloquent

分享到: