【laralve项目】@14 laravel-admin处理后台分类,选择上级模型树(1)

简介: 【laralve项目】@14 laravel-admin处理后台分类,选择上级模型树

需求

屏幕快照 2022-05-16 上午11.59.19.png

准备素材

1.安装laravel

2.安装laravle-admin

3.分类数据库

提供素材

这里就只提供数据库的素材了,至于laravel跟laravel-admin的素材自己直接下载即可

模型文件

存放位置app\Models\GoodsCategory.php

然后放置下面的内容

<?php
namespace App\Models;
use Encore\Admin\Traits\AdminBuilder;
use Encore\Admin\Traits\ModelTree;
use Illuminate\Database\Eloquent\Model;
/**
 * 商品分类
 */
class GoodsCategory extends Model
{
    use ModelTree, AdminBuilder;
    protected  $fillable = ['name', 'category_image'];
    protected $appends = ['levels'];
    public function __construct(array $attributes = [])
    {
        parent::__construct($attributes);
        $this->setParentColumn('parent_id');
        $this->setOrderColumn('sort');
        $this->setTitleColumn('name');
    }
    public function parent()
    {
        //反向关联
        return $this->belongsTo(GoodsCategory::class);
    }
    public function children() {
        //一对多
        return $this->hasMany(GoodsCategory::class, 'parent_id');
    }
    //定义一个访问器,获取所有祖先类目的ID值
    public function getPossessIdsAttribute()
    {
        //array_filter 将数组中的空值移除
        return array_filter(explode('-', trim($this->possess, '-')));
    }
    //定义一个访问器,获取祖先类目并按层级排序
    public function getAncestorsAttribute()
    {
        return GoodsCategory::query()
            ->whereIn('id', $this->possess_ids)
            //按层级排序
            ->orderBy('level')->get();
    }
    //定义一个访问器,获取以 - 为分隔的所有祖先类目的名称以及当前类目的名称
    public function getFullNameAttribute()
    {
        return $this->ancestors //获取所有祖先类
            ->pluck('name') //获取祖先类目的name 字段为一个数组
            ->push($this->name)//获取当前类目的 name 字段加到数组的末尾
            ->implode(' - '); //用 - 符合将数组的值组成一个字符串
    }
    public function getLevelsAttribute($value) {
        $data = [
            '0' => '根目录',
            '1' => '二级',
            '2' => '三级',
        ];
        // return (is_null($value)) ? $data : $data[$value];
        return (is_null($this->attributes['level'])) ? $data : $data[$this->attributes['level']];
    }
    /**
     * 测试方法
     * @return [type] [description]
     */
    public function test()
    {
        $category = GoodsCategory::where('id', 105)->first();
        $data = $category->ancestors->toArray();
        return $data;
    }
}

数据库迁移文件

把这个份文件放database\migrations

执行创建迁移文件

php artisan make:migration create_goods_category_table --create=GoodsCategory

在执行迁移文件

php artisan migrate
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateGoodsCategoriesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('goods_categories', function (Blueprint $table) {
            $table->increments('id')->comment('商品类别主键id');
            $table->string('name')->comment('类别名称');
            $table->integer('parent_id')->default(0)->comment('父级类别id');
            $table->string('image')->nullable()->comment('分类图片');
            $table->integer('level')->default(0)->comment('分类等级');
            $table->integer('sort')->default(0)->comment('分类排序');
            $table->timestamps();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('goods_categories');
    }
}

数据库填充文件

<?php
use App\Models\GoodsCategory;
use Illuminate\Database\Seeder;
class GoodsCategoryTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $categories = [
            [
                'name'     => '手机配件',
                'sort'     => '0',
                'children' => [
                    [
                        'name'     => '手机壳',
                        'sort'     => '0',
                        'children' => [
                            [
                                'name' => '华为V10手机',
                                'sort'     => '0',
                            ],
                            [
                                'name' => '小米',
                                'sort'     => '1',
                            ],
                        ],
                    ],
                    [
                        'name'     => '数据线',
                        'sort'     => '4',
                        'children' => [
                            [
                                'name' => '苹果数据线',
                                'sort'     => '0',
                            ],
                            [
                                'name' => '安卓数据线',
                                'sort'     => '1',
                            ],
                        ],
                    ],
                    [
                        'name'     => '耳机',
                        'sort'     => '0',
                        'children' => [
                            [
                                'name' => '有线耳机',
                                'sort'     => '1',
                            ],
                            [
                                'name' => '蓝牙耳机',
                                'sort'     => '0',
                            ],
                        ],
                    ],
                ],
            ],
            [
                'name'     => '六星果园',
                'sort'     => '0',
                'children' => [
                    [
                        'name'     => '国产水果',
                        'sort'     => '0',
                        'children' => [
                            [
                                'name' => '苹果',
                                'sort'     => '0',
                            ],
                            [
                                'name' => '梨',
                                'sort'     => '1',
                            ],
                        ],
                    ],
                ]
            ]
        ];
        foreach ($categories as $data) {
            $this->createCategory($data);
        }
    }
    public function createCategory($data, $parent = null)
    {
        // 创建一个分类
        $category = new GoodsCategory([
            'name' => $data['name'],
            'sort' => $data['sort'],
        ]);
        // 如果有父级参数,代表有父类目
        if (!is_null($parent)) {
            // 将模型实例与给定的父实例关联。
            $category->parent()->associate($parent);
        }
        // 保存到数据库
        $category->save();
        // 如果有children字段并且 children字段是一个数组
        if (isset($data['children']) && is_array($data['children'])) {
            foreach ($data['children'] as $child) {
                $this->createCategory($child, $category);
            }
        }
    }
}

文件放在database\seeds\GoodsCategoryTableSeeder.php


这里还需要一个观察者

app\Observers\GoodsCategoryObserver.php


php artisan make:observer GoodsCategoryObserver --model=GoodsCategory


相关文章
|
8月前
|
算法 前端开发 JavaScript
若依框架---数据转树状层级
若依框架---数据转树状层级
573 0
|
7月前
|
数据处理 Python
Flask 项目工程目录层级划分
本文介绍了如何将 Flask 项目工程目录层级按照主题分类划分,主要包括模型层、视图层、表单层、模板文件和静态文件。通过合理地组织项目文件,可以提高项目的可读性、可维护性和可扩展性。
106 5
|
存储 关系型数据库 MySQL
WordPress 核心中未包含的 WordPress 网站组件
WordPress 核心中未包含的 WordPress 网站组件 之前 WordPress 核心文件北京六翼的开发工程师已经介绍过了,下面让我们来看看 WordPress 核心文件中不包含的内容。 WordPress 数据库– WordPress 数据库存储了您的 WordPress 网站的大部分内容。
WordPress 核心中未包含的 WordPress 网站组件
|
存储
学习笔记jira项目22usecontent存储全局信息
学习笔记jira项目22usecontent存储全局信息
77 0
学习笔记jira项目22usecontent存储全局信息
|
Java 开发者
后台分类模块之相关类之创建 | 学习笔记
快速学习后台分类模块之相关类之创建
102 0
【laralve项目】@14 laravel-admin处理后台分类,选择上级模型树(2)
【laralve项目】@14 laravel-admin处理后台分类,选择上级模型树
153 0
【laralve项目】@14 laravel-admin处理后台分类,选择上级模型树(2)
【laralve项目】@14 laravel-admin处理后台分类,选择上级
【laralve项目】@14 laravel-admin处理后台分类,选择上级
98 0
【laralve项目】@14 laravel-admin处理后台分类,选择上级
|
PHP
【laravel项目】@16 修改后台分类
【laravel项目】@16 修改后台分类
107 0
【laravel项目】@16 修改后台分类
|
存储 Java 数据库
后台分类模块之相关类创建| 学习笔记
快速学习后台分类模块之相关类创建。
117 0
|
Java 开发者
后台分类模块之相关类之创建 | 学习笔记
快速学习后台分类模块之相关类之创建
104 0