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

作者 : OO资源中心 发布时间: 2020-05-11 文章热度:253 共1957个字,阅读需5分钟。 本文内容有更新 字体:

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

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

使用 Laravel Eloquent 的 hasMany 来开发无限极分类插图

数据库迁移

简单的数据表结构:

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

数据表数据如下:

使用 Laravel Eloquent 的 hasMany 来开发无限极分类插图(1)

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’),因此只要当前子类别中有类别,模板就会递归地加载子类别。

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

    《》《》

    相关推荐: ThinkPHP6 事件与多应用

    事件1. 事件和中间件有一点相似,只不过事件更加的精准定位更细腻的业务场景; 2. 事件可定义:事件类、事件监听类、事件订阅类; 3. 我们先创建一个测试事件的类:TestEvent.php,手动创建一个测试类; public function __const…


    关注微信公众号『OOINK』

    第一时间了解最新资源动态关注OO.INK不迷路~

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    下载资源需要解压密码,解压密码是什么?
    如下载的资源需要解压密码,请查看下载页右侧查找解压密码;
    如没有解压密码请尝试默认解压密码:www.oo.ink 或者 oo.ink
    或者联系我们获取解压密码!
    1、本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2、分享目的仅供大家学习和交流,请不要用于商业用途!
    3、本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    4、如有链接无法下载、失效或广告,请联系管理员处理!
    5、本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!

    OO.INK资源网 » 使用 Laravel Eloquent 的 hasMany 来开发无限极分类
    +已在风雨中度过
    为兴趣而改变,为梦想而努力!
    +已坚持更新
    时时更新,确保最新~

    开通SVIP,畅享全站资源下载~

    立即了解