onezero3623 2019-04-20 17:55:24 3107次浏览 0条评论 2 0 0

规则: 需要在 header 中写入批量的标识: 如: curl -i -H "limit:100" 表示一次输入 100 条数据

重写 rest 中的 createAction 类,run 方法: 判断如果是 header 中标识,执行批量操作。

if (Yii::$app->getRequest()->getHeaders()->get('limit') > 1) {
    $result = $model->batchInsert($postData);
} else {
    $model->load(Yii::$app->getRequest()->getBodyParams(), '');
    $result = $model->save();
}

重写子类 ApiActiveRecord 继承 ActiveRecord 类,创建批量导入的方法,对数据进行格式验证和默认数据写入,做数据初始化处理,然后调用 db 类执行 batchInsert 方法。

class ApiActiveRecord extends ActiveRecord
{
    public function batchInsert($batchData)
    {
        $batchInsertData = [];
        foreach ($batchData as $data)
        {
            $this->load([$this->formName()=>$data]);
            //批量插入的数据也需要验证
            if (!$this->validate()){
                throw new \Exception($this->getErrors());
            }
            //初始化数据
            if (!$this->beforeSave(true)) {
                throw new \Exception($this->getErrors());
            }
            $batchInsertData[] = $this->getDirtyAttributes();
        }
        if (is_array($batchInsertData) && isset($batchInsertData[0])){
            $attibutes = array_keys($batchInsertData[0]);
            return  Yii::$app->db->createCommand()->batchInsert($this->tableName(), $attibutes, $batchInsertData)->execute();
        }else{
            throw new \Exception('数据初始化出错');
        }
    }
}
    没有找到数据。
您需要登录后才可以评论。登录 | 立即注册