Yii2.0 – 批量插入
     发布在:PHP      浏览:55      评论:0 条评论

关键代码在try里,用到了事务处理

若不理解什么是事务处理,请看我的另一篇文章《Yii2.0 事务处理》

public function OrderInsert($account_id, $supplier_id, $start_date, $end_date)
{
    $orders = Order::find()
            -> where('is_purchase = :supplier_id and updated >= :start_date and updated < :end_date',
                [
                    ':supplier_id' = $supplier_id,
                    ':start_date' = $start_date,
                    ':end_date' = $end_date
                ]
            ) -> asArray() -> all(); // 查询订单数据

    $data = []; // 存储需要插入数据表的数据

    foreach ($orders as $k => $v) {

        $order = [
            'account_id'  => $account_id,       // 账单id
            'order_id'    => $v['order_id'],    // 订单id
            'order_price' => $v['order_price'], // 订单价格
        ];

        array_push($data, $order); // 在$data数组末尾插入$order数组

    }

    $transaction = Yii::$app -> db -> beginTransaction(); // 开启事务处理

    try {
        /************************* 第一种方法 ******************************/

        // Yii2.0内置批量插入方法 batchInsert(表名, 字段, 数据)
        // 数据的格式请看上面foreach后的$data,自个儿琢磨一下
        $result = Yii::$app -> db -> createCommand()
                -> batchInsert(AccountDetail::tableName(),
                [
                    'account_id',
                    'order_id',
                    'order_price',
                ], $data) -> execute();

        if (!result) throw new \Exception('插入失败');

        /************************* 第二种方法 ******************************/

        // 利用save()方法逐个插入数据表
        foreach ($data as $k => $v) {

            $model = new AccountDetail;

            $result = $model -> load($v, '') && $model -> save();

            if (!result) throw new \Exception('插入失败');

        }

        $transaction -> commit(); // 事务提交

    } catch (\Exception $e) {

        $transaction -> rollback(); // 事务撤回

        return $e -> getMessage(); // 返回报错信息

    }

    return true;
}

给自己码上

    Responses