1.先建立相应的数据表
- 商品类型表 type 表
- 商品属性表 attribute表
- 商品规格表 spec表
- 商品规格值表 spec_value表
-
名称 备注 id 模型id type_name 模型名 specs 规格数据集 attrs 属性数据集 名称 备注 id 规格id type_id 所属模型id spec_name 规格名称 sort 排序 spec_values 规格值数据集 名称 备注 id 规格值id spec_id 所属规格id spec_value 规格值 type_id 所属模型id 名称 备注 id 属性id attr_name 属性名称 type_id 所属模型id attr_values 可选值数组(可能为空) sort 排序
2.先判断之间的关联关系
- 一个类型对应多个属性,规格,规格值
- 一个规格对应多个规格值
3.类型添加接口
代码:控制器
public function save(Request $request) { //接收参数 $params = $request->post(); //验证参数 $validate = new Validate([ ‘type_name|商品类型名称‘ => ‘require|max:25‘, ‘spec|商品规格‘ => ‘require|array‘, ‘attr|商品属性‘ => ‘require|array‘, ]); if (!$validate->check($params)) { $msg = $validate->getError(); return getJsonFail(500, $msg); } /*var_dump($params);die();*/ $result = \app\logic\model\Type::addType($params); return json($result); }
逻辑层
//添加 public static function addType($params) { //数剧处理 //对规格进行处理 foreach ($params[‘spec‘] as $key => $item) { //判断规格名是否为空 if (empty(trim($item[‘name‘]))) { //如果为空 删除 根据下标删除这个规格 unset($params[‘spec‘][$key]); continue;//跳出循环 } //循环规格值 处理 foreach ($item[‘value‘] as $k => $val) { //验证规格值下是否为空 if (empty(trim($val))) { //如果为空 根据下标删除规格值 unset($params[‘spec‘][$key][‘value‘][$k]); } //验证规格名下是否有规格值 如果没有 将规格也删除 if (empty($item[‘value‘][$k])) { //为空删除 unset($params[‘spec‘][$key]); } } } //对属性进行数据处理 foreach ($params[‘attr‘] as $key => $attr) { //判断属性名是否为空 if (empty(trim($attr[‘name‘]))) { //如果为空 删除 根据下标删除属性名 unset($params[‘attr‘][$key]); continue;//跳出循环 } //循环属性值 对属性值处理 foreach ($attr[‘value‘] as $k => $val) { //验证属性值下是否为空 if (empty(trim($val))) { //如果为空 根据下标删除属性值 unset($params[‘attr‘][$key][‘value‘][$k]); } //验证属性下是否有属性值 如果没有 将属性也删除 if (empty($attr[‘value‘][$k])) { //为空删除 unset($params[‘attr‘][$key]); } } } /*var_dump($params);die();*/ //数据处理完成后 开始添加数据 //开启事务 Db::startTrans(); try { //添加类型 $addType = [ ‘type_name‘ => $params[‘type_name‘] ]; $type = \app\api\model\Type::insertType($addType); //添加属性 $addAttr = []; foreach ($params[‘attr‘] as $key => $attr) { $row = [ ‘attr_name‘ => $attr[‘name‘],//属性名 ‘sort‘ => $attr[‘sort‘],//排序 ‘attr_values‘ => implode(‘,‘, $attr[‘value‘]),//属性值 ‘type_id‘ => $type[‘id‘]//商品类型id ]; $addAttr[] = $row; } //可能是添加多条 $attrObj = new Attribute(); $attribute = $attrObj->insertAll($addAttr); //添加规格名 $addSpec = []; foreach ($params[‘spec‘] as $k => $item) { $row = [ ‘spec_name‘ => $item[‘name‘],//规格名 ‘sort‘ => $item[‘sort‘],//排序 ‘type_id‘ => $type[‘id‘]//商品类型id 外键 ]; $addSpec[] = $row; } //可能添加多条 $specObj = new Spec(); $specData = $specObj->saveAll($addSpec); //添加商品规格值 $addSpecValue = []; foreach ($params[‘spec‘] as $key => $spec) { //循环规格 foreach ($spec[‘value‘] as $k => $specValue) { //循环规格值 $row = [ ‘spec_id‘ => $specData[$key][‘id‘], //刚刚添加的规格的id ‘type_id‘ => $type[‘id‘], //外键 类型id ‘spec_value‘ => $specValue //规格值 ]; $addSpecValue[] = $row; } } //添加规格值 $specValueObj = new SpecValue(); $SpecValueData = $specValueObj->insertAll($addSpecValue); //提交事务 Db::commit(); $arr[‘code‘] = 200; $arr[‘msg‘] = ‘success‘; $arr[‘data‘] = $type; return $arr; } catch (\Exception $e) { //事务回滚 Db::rollback(); $arr[‘code‘] = 500; $arr[‘msg‘] = $e->getMessage(); return $arr; } }
模型层只有一个类型的单条增加 用create()保存即可