php hasmany,使用 Laravel Eloquent 的 hasMany 来开发无限极分类

本文详细指导如何使用Laravel框架的Eloquent ORM,通过hasMany方法优雅地实现电子商务网站的多级分类,包括数据库设计、模型关联、路由控制和视图递归,让你轻松掌握无限级分类的开发技巧。
摘要由CSDN通过智能技术生成

下面由Laravel开发入门教程栏目给大家介绍使用 Laravel Eloquent 的 hasMany 来开发无限极分类的方法,希望对需要的朋友有所帮助!

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

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

56f20b6678f347523cebe34865f14548.png

数据库迁移

简单的数据表结构: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

数据表数据如下:

68cfcdc11236d6133a9e68e65adbe634.png

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 文件:

@foreach ($categories as $category)

{{ $category->name }}

@foreach ($category->childrenCategories as $childCategory)

@include('child_category', ['child_category' => $childCategory])

@endforeach

@endforeach

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

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

{{ $child_category->name }}

@if ($child_category->categories)

@foreach ($child_category->categories as $childCategory)

@include('child_category', ['child_category' => $childCategory])

@endforeach

@endif

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

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

更多laravel框架技术文章,请访问laravel教程!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值