【laravel项目】@13 解决访问器与数据填充冲突(1)

简介: 【laravel项目】@13 解决访问器与数据填充冲突

解决访问器与数据填充冲突问题


所用的知识点

素材需要

数据库

GoodsCategory模型

创建GoodsCategoryTableSeeder.php数据填充文件

创建GoodsCategoryObserver.php观察者

创建数据库迁移文件

注册观察者

重现数据填充与访问器冲突

执行数据填充命令

日志检测问题

检测level字段的问题

解决访问器与数据填充时的冲突

解决设置的访问器不能正常使用



所用的知识点

1.迁移文件的创建

2.数据填充

3.通过观察者监听模型事件

4.注册观察者

5.模型

素材需要

数据库

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

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
/**
 * 商品分类
 */
class GoodsCategory extends Model
{
    protected  $fillable = ['name', 'category_image'];
    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 getLevelAttribute($value) {
        $data = [
            '0' => '根目录',
            '1' => '二级',
            '2' => '三级',
        ];
        return (is_null($value)) ? $data : $data[$value];
    }
    /**
     * 测试方法
     * @return [type] [description]
     */
    public function test() {
        $category = GoodsCategory::where('id', 10)->first();
        $data = $category->ancestors->toArray();
        return $data;
    }
}

创建GoodsCategoryTableSeeder.php数据填充文件

命令:php artisan make:seeder GoodsCategoryTableSeeder

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

<?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);
            }
        }
    }
}
相关文章
uniapp 全局数据(globalData)的设置,获取,更改
uniapp 全局数据(globalData)的设置,获取,更改
2770 0
|
3月前
|
PHP 开发者 容器
PHP命名空间深度解析:避免命名冲突与提升代码组织####
本文深入探讨了PHP中命名空间的概念、用途及最佳实践,揭示其在解决全局命名冲突、提高代码可维护性方面的重要性。通过生动实例和详尽分析,本文将帮助开发者有效利用命名空间来优化大型项目结构,确保代码的清晰与高效。 ####
76 20
|
10月前
|
PHP 开发者
【专栏】介绍PHP的命名空间,它是一个用于封装代码、避免名称冲突的机制
【4月更文挑战第27天】本文介绍了PHP的命名空间,它是一个用于封装代码、避免名称冲突的机制。命名空间的作用包括:防止大型项目中的命名冲突,提升代码可读性和可维护性,以及方便代码重用。文章详细阐述了如何定义、导入命名空间,使用完全限定名称以及设置命名空间别名。通过实例展示了命名空间在项目模块划分和第三方库如Laravel中的应用,强调了命名空间在组织和管理PHP代码中的关键作用。
84 4
|
7月前
|
缓存 前端开发 JavaScript
Webpack 模块解析:打包原理、构造形式、扣代码补参数和全局导出
Webpack 模块解析:打包原理、构造形式、扣代码补参数和全局导出
335 1
|
8月前
|
前端开发 NoSQL JavaScript
若依修改---重新部署项目注意事项,新文件初始化需要修改的地方,打包后的文件很难进行修改,如果想要不断修改项目,注意保存原项目,才可以不断修改,前端:在Vue.config.js文件中修改target
若依修改---重新部署项目注意事项,新文件初始化需要修改的地方,打包后的文件很难进行修改,如果想要不断修改项目,注意保存原项目,才可以不断修改,前端:在Vue.config.js文件中修改target
|
8月前
|
前端开发 JavaScript Linux
若依修改之后,无法访问前端项目如何解决,只能访问后端的接口,我的接口8083,端不显示咋解决?在vue.config.js文件中的映射路径要跟后端匹配,到软件商店里找到Ngnix配置代理,设80不用加
若依修改之后,无法访问前端项目如何解决,只能访问后端的接口,我的接口8083,端不显示咋解决?在vue.config.js文件中的映射路径要跟后端匹配,到软件商店里找到Ngnix配置代理,设80不用加
|
9月前
|
监控 Java
记录页面修改差异(java注解实现)
记录页面修改差异(java注解实现)
|
10月前
|
缓存 NoSQL 数据库
总结 做项目的一点自己的想法 在开发中我觉得可以修改的地方
总结 做项目的一点自己的想法 在开发中我觉得可以修改的地方
48 1
|
小程序 索引
|
JavaScript 开发者
Vite 在运行过程中是如何发现新增依赖的?
Vite 在运行过程中是如何发现新增依赖的?
260 0