《【laralve项目】@12 商品分类--观察者模式--单元测试--处理无极限分类.docx》由会员分享,可在线阅读,更多相关《【laralve项目】@12 商品分类--观察者模式--单元测试--处理无极限分类.docx(20页珍藏版)》请在金锄头文库上搜索。
1、【laralve项目】12 商品分类-观察者模式-单元测试-处理无极限分类我们需要先执行数据库迁移 然后会在数据库创建出对应的表 然后我们需要创建出对应的模型跟数据填充文件 我们可以看一分类表的数据 平时的分类基本都市这样的水果(0) |-外国水果(1) | |-栗子(2) | |-国产水果(1) |-栗子(2)注意如果我们使用上面那种数据表的结构的话会存在这问题。如果数据量很多的时候就会出现。1.场景一:从上级开始查找它所有的子级,这个时候就需要使用递归的算法去查询所有的子级内容,同时会产生很多的SQL查询,从而影响性能。2.场景二:从最小的子级开始查找所有的上级,这个时候同样的也是递归的方
2、式查找,同样也有很多的查询SQL3.场景三:这个情景可能会在多级分销中出现,就是判断哪个内容是否存在上下级的关系应对与这个三个问题的解决可以通过新增一个字段possess来记录一个内容中的所有上级id,可以通过任意分割符号进行分比如在本次项目中可以使用-php artisan make:migration add_path_to_goods_categories_table -table=goods_categories 加了这个字段之后对于上面的三个问题的解决1.从上往下查找的时候字只需要取出那个字段的内容,然后wherepossess like -1-%即可2.从下往上查找的时候只需要获取
3、那个字段,然后同样的字符串处理就好了3.判断是否存在关系,先获取level最大的那个信息中的possess的值。然后再获取了一个possess同时在这个值上跟上这条数据的id-。然后判断第一个值的内容是否以第二个值的内容开头如果是就存在关系,否则相反修改模型定义了一个关联关系,在category定义一个与上级以及子级的模型关联。然后添加三个获取器;1.获取所有的上级id,2.根据获取的id获取子级的所有上级,并且根据level排序。至于之后一个只是获取所有的上级名称 源码:belongsTo(GoodsCategory:class); public function children() /一
4、对多 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(i
5、d, $this-possess_ids) /按层级排序 -orderBy(level)-get(); /定义一个访问器,获取以 - 为分隔的所有祖先类目的名称以及当前类目的名称 public function getFullNameAttribute() return $this-ancestors /获取所有祖先类 -pluck(name) /获取祖先类目的name 字段为一个数组 -push($this-name)/获取当前类目的 name 字段加到数组的末尾 -implode( - ); /用 - 符合将数组的值组成一个字符串 / public function getLevelAtt
6、ribute($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; 然后添加一个观察者针对于数据新增的时候操作php
7、artisan make:observer GoodsCategoryObserver -model=GoodsCategory 在里面主要是判断,是否存在上级的;如果存在上级就操作一下;设计一下possess与level,这里的方法一定要注意,不了解的去看文档,否则你会进入无限的报错中 然后注册观察者php artisan make:provider ModelObserverServiceProvider 我们可以看一下文档怎么进行注册 然后把ModelObserverProvider注册到服务里边 最后就是数据填充创建GoodsCategoryTableSeeder数据填充文件php artisan make:seeder GoodsCategoryTableSeeder 源码: 手机配件, sort = 0, children = name = 手机壳, sort = 0, children = name = 华为V10手机, sort = 0, , name = 小米, sort = 1, , , , name = 数据线, sort = 4, children = name = 苹果数据线,