tp5.0 模拟电商项目中商品类型的添加

1.先建立相应的数据表

  1. 商品类型表  type 表
  2. 商品属性表  attribute表
  3. 商品规格表  spec表
  4. 商品规格值表  spec_value表
  5. 名称 备注
    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()保存即可

tp5.0 模拟电商项目中商品类型的添加

上一篇:Git


下一篇:sg2021090721407-管理范畴-v1_beta