如何使用Laravel Eloquent来开发无限极分类
发布:smiling 来源: PHP粉丝网 添加日期:2022-05-02 12:32:01 浏览: 评论:0
在网上商城上,我们经常可以看到多级分类、子分类、甚至无限极分类,本文将向你展示如何优雅的通过 Laravel Eloquent 将其实现。
概述
我们会创建一个微型项目来展示儿童商店的分类,总共有 5 级,如下:
数据库迁移
简单的数据表结构:
- Schema::create('categories', function (Blueprint $table) {
- $table->bigIncrements('id');
- $table->string('name');
- $table->unsignedBigInteger('category_id')->nullable();
- $table->foreign('category_id')->references('id')->on('categories');
- $table->timestamps();
- });
只有一个 name 字段, 关联到其自身,所以,大部分父级分类 category_id = NULL,每一个子分类都有一个 parent_id。
数据表数据如下:
Eloquent 模型和关联关系
首先,在 app/Category.php 创建一个简单的 hasMany() 方法, 分类可能拥有其自分类:
- class Category extends Model
- {
- public function categories()
- {
- return $this->hasMany(Category::class);
- }
- }
好戏开场 本文最妙 “计策”,你知道可以向这样描述 递归 关系吗?如下:
- public function childrenCategories()
- {
- 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 如下所示:
- public function index()
- {
- $categories = Category::whereNull('category_id')
- ->with('childrenCategories')
- ->get();
- return view('categories', compact('categories'));
- }
我们仅加载父类别,将子类别作为关系,简单吧?
视图和递归子视图
最后,渲染到页面,在 resources/views/categories.blade.php 文件:
- <ul>
- @foreach ($categories as $category)
- <li>{{ $category->name }}</li>
- <ul>
- @foreach ($category->childrenCategories as $childCategory)
- @include('child_category', ['child_category' => $childCategory])
- @endforeach
- </ul>
- @endforeach
- </ul>
我们先遍历了最顶级的父类别,然后遍历出父类的子类别,然后使用 @include 加载子类别的子类别......
最好的部分是 resources/views/admin/child_category.blade.php 将使用递归加载自身,看代码:
- <li>{{ $child_category->name }}</li>
- @if ($child_category->categories)
- <ul>
- @foreach ($child_category->categories as $childCategory)
- @include('child_category', ['child_category' => $childCategory])
- @endforeach
- </ul>
- @endif
在 child_category.blade.php 内部,我们包含了 @include(‘child_category'),因此只要当前子类别中有类别,模板就会递归地加载子类别。
就是这样!我们拥有无限级别的子类别 - 无论是在数据库还是关联关系或是视图中。
Tags: Laravel无限极分类 Eloquent
- 上一篇:如何在Laravel中验证zip里的文件
- 下一篇:最后一页
相关文章
- ·Laravel 5框架学习之Eloquent 关系(2021-05-22)
- ·laravel 数据迁移与 Eloquent ORM的实现方法(2021-11-16)
- ·Laravel5.7 Eloquent ORM快速入门详解(2021-11-16)
- ·Laravel Eloquent ORM 多条件查询的例子(2021-12-28)
- ·Laravel Eloquent ORM 实现查询表中指定的字段(2022-01-08)
- ·使用laravel的Eloquent模型如何获取数据库的指定列(2022-01-08)
- ·laravel 之 Eloquent 模型修改器和序列化示例(2022-01-08)
- ·laravel5 Eloquent 实现事务方式(2022-01-14)
- ·laravel 解决Eloquent ORM的save方法无法插入数据的问题(2022-01-14)
- ·Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()(2022-01-16)
- ·Laravel Eloquent分表方法并使用模型关联的实现(2022-01-24)
- ·Laravel框架Eloquent ORM删除数据操作示例(2022-01-25)
- ·laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析(2022-02-01)
- ·Laravel 手动开关 Eloquent 修改器的操作方法(2022-02-01)
- ·laravel5.6 框架操作数据 Eloquent ORM用法示例(2022-02-08)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)