logo

  • 欢迎各位友链


  • 首页
  • 关于
  • 技术文章
  • 资源分享
  • 微语
  • 相册
  • 优秀博客
  • 留言

Laravel Eloquent: 使用 hasMany 来处理『无限极分类』

 2020/01/24
 Garlic
 0
 725
“ 在网上商城上,我们经常可以看到多级分类、子分类、甚至无限极分类。本文将向你展示如何优雅的通过LaravelEloquent将其实现。我们会创建一个微型项目来展示儿童商店的分类,总共有5级,如下:数据库迁移简单 ”
Laravel Eloquent: 使用 hasMany 来处理『无限极分类』

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

我们会创建一个微型项目来展示儿童商店的分类

数据库迁移

简单的数据表结构:

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

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

本文转自 Laravel Eloquent: 使用 hasMany 来处理『无限极分类』


支付宝 微信
 100

PHP Laravel
  • 本文链接: Laravel Eloquent: 使用 hasMany 来处理『无限极分类』 | Garlic`s Blog
  • 版权声明:若无特殊注明,本文皆为《Garlic`s Blog》原创,转载请保留文章出处。
  • 备注:相关侵权、举报、投诉及建议等,请发E-mail:php_garlic@163.com。
 Laravel 中的模型事件与 Observer
 PHP常用的字符串函数
  • 日常开发的效率提升工具
    日常开发的效率提升工具
  • 宝塔7.6.0去除登陆限制,及强制跳转 /bind解决方法
    宝塔7.6.0去除登陆限制,及强制跳转 /bind解决方法
  • Laravel 常用扩展包
    Laravel 常用扩展包
  • Laravel route() 方法生成 HTTPS 链接
    Laravel route() 方法生成 HTTPS 链接
暂无评论,快抢沙发吧~
  • 😋 支持Emoji表情,可用的 Emoji 请见 🤘 👉 Emoji 列表 ⭐ ✨
 请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!



 验证码
Garlic
Garlic
你能够拥有梦想,而且梦想能够实现,网络是离你梦想最近的地方!
 269
 关注 公众号
1150 本站已勉强运行
PV 今日pv
27 文章数量
文章搜索
最新评论
  • nevermore
    nevermore 2020/12/16
    文章

    博主这个网站搭建花了多久的哈。扒代码花了多久的哈

  • 演员
    演员 2020/10/03
    文章

    老哥这板子好帅,能分享哈不

 点击排行
 最多点赞
  • 宝塔面板安装云锁Nginx自编译web防护教程
    宝塔面板安装云锁Nginx自编译web防护教程
    2019/12/06浏览:750
  • Laravel Eloquent: 使用 hasMany 来处理『无限极分类』
    Laravel Eloquent: 使用 hasMany 来处理『无限极分类』
    2020/01/24浏览:725
  • PHP常用的字符串函数
    PHP常用的字符串函数
    2020/01/26浏览:627
  • Laravel Eloquent: 使用 hasMany 来处理『无限极分类』
    Laravel Eloquent: 使用 hasMany 来处理『无限极分类』
    2020/01/24点赞:100
  • 清除Windows 垃圾
    清除Windows 垃圾
    2020/09/30点赞:87
  • 日常开发的效率提升工具
    日常开发的效率提升工具
    2021/10/19点赞:81
 标签
常用工具 Windows 宝塔 Office SoftEther 负载均衡 百度网盘 Yii Thinkphp Apache
 友情链接
Laravel China 社区 椰子皮博客 站点导航
首页 Emoji 表情列表 网站地图
CopyRight © 2019 - 2023 - Garlic`s Blog - 粤ICP备17064364号-1
声明: 本站资源来源自网络,如有侵权,请联系站长删除! 本站前端模板采用 椰子皮博客