YII2模型层添加数据为什么没反应?

朋友抬一手
  • 85

在写进销存的时候,在入库的时候需要把商品加到仓库中。代码如下

   public function actionCreate()
    {
        $model = new Goods();
        $model->sku = strtoupper(uniqid());
        $model->datetime = time();
        $model->admin_id = Yii::$app->user->id;

        if ($model->load(Yii::$app->request->post())) {
            $cost = $model->cost_price;
            $number = $model->numbers;
            $model->total = $cost * $number;
            $models=ArrayHelper::toArray($model);
            if ($model) {
                $model->save();
                $models->add($models);
                return $this->redirect(['view', 'id' => $model->id]);
            }

        } else {
            return $this->render('create', [
                'model' => $model,
            ]);
        }
    }

这是添加到入库表的,$models->add($models);是添加到仓库表模型层的方法

  public function add($data)
    {

        foreach ($data as $k=>$v)
        {
            $asku = Warehouse::find()->where(['sku'=>$v['sku']])->one();
            $askuCount = Warehouse::find()->where(['sku'=>$v['sku']])->count();

        }
        if (!$askuCount)
        {
            $Warehouse=new Warehouse;
            $Warehouse->datetime=time();
            $Warehouse->cid=$data['cid'];
            $Warehouse->name=$data['name'];
            $Warehouse->sku=$data['sku'];
            $Warehouse->counts=$data['numbers'];
            $Warehouse->price=$data['price'];
            $Warehouse->flag=1;
            $Warehouse->save();
        }else{
            $asku->counts += $data['numbers'];
            $asku->timeLastOp=time();
            $asku->save();
        }
    }

可以打印出数据,但是不知道为什么添加之后不能再Warehouse这个表中添加数据,有人知道吗?刚用框架两天,不是很懂。

回复
阅读 2.6k
6 个回答

谢邀,没用过yii2,你可以看看框架日志,看看执行的sql是怎么样的

张文杰
  • 3
新手上路,请多包涵

你这样是修改数据,new Warehouse()才是新增。另外,循环之内,尽量别写sql语句。

model中有个对于存进数据库的校验规则不知道你是否写了。形如下面代码:

public function rules()
    {
        return [
            [['user_id', 'bag_id', 'create_time'], 'required'],
        ];
    }

你的每一个字段都要写到里面去,如果不需要验证的可以直接都是用safe

一般验证不通过,或者没有验证,Yii不会将数据插入数据库,除非数据库报错,否则不会报错。所以,你需要检测一下save的返回值,如果是false,那么你可以使用$model->getErrors()来获取一下到底报了什么错误。

add 方法里 foreach$askuCount 这个变量是只存了最后一次循环结果吧,你循环外判断这个不应该是 += 的结果吗?或者说你把 if 判断放循环里。

目前问题的解决方法:
把 if (!$askuCount) 的代码放到循环中即可插入数据

建议:
不要用循环操作数据库,建议用批量插入

请了解ORM
Yii2的模型操作数据库 返回的是一个对象 如果你放在循环中 这个对象一直指向的是第一个成功插入的那条记录
以后再用来操作 就是更新操作
新版本的tp5.0也借鉴了此种思想

你知道吗?

宣传栏