Yii2中的Active Record可以批量插入数据吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Yii2中的Active Record可以批量插入数据吗相关的知识,希望对你有一定的参考价值。

参考技术A 批量添加这个操作,在实际开发中经常用得到,今天小编抽空给大家整理些有关yii2批量添加的问题,感兴趣的朋友一起看看吧。 在上篇文章给大家介绍了关于浅析Yii2 gridview实现批量删除教程,当然,着重点在于怎么去操作gridview了,今儿我们来好好谈谈yii2如何批量添加数据? 有同学嚷嚷了,这还不简单,我foreach一循环,每个循环里面直接把数据插入到数据库,简单粗暴完事!我擦嘞,哥,你要是跟我在一个公司,我觉得第二天见到你的概率可就不大了! 话不多说,说多了你在骂我,我们步入正题,先看一个简单到小学生都认识的表结构 //test id name 我们现在就是要在yii2中对这张数据表批量插入10条数据 我们想要的方式肯定是下面这样的,一条sql多么干脆直接了事 insert into test (name) values ('zhangsan'), ('lisi'); 分析都分析完了,好吧,赶紧看看具体实现 //假如 $names = ['zhangsan', 'lisi']; $data = []; foreach ($names $k => $v) $data[] = [$v]; Yii::$app->db->createCommand()->batchInsert('test', ['name'], $data)->execute(); 我相信很多人都是冲着AR能不能实现批量插入来的,理由无非就是更安全更方便操作呗。但是官方手册貌似没有,没有,没有。。。心都碎了,竟然没有,至少我没有找到,你找到了请点击原文找到我并联系我,我也si分的需要方法啊。 不过不巧的是,我找到一个跟AR相关联的操作方法,我们共同分享参考一下看看具体怎么回事 假设有一个Post类的数组 $models,你就可以这样操作 use yii\helpers\ArrayHelper; $rows = []; foreach ($models as $model) if ($model->validate()) $rows[] = $model->attributes; $rows = ArrayHelper::getColumn($models, 'attributes'); $postModel = new Post; Yii::$app->db->createCommand()->batchInsert(Post::tableName(), $postModel->attributes(), $rows)->execute(); //当然啦,上面给出的是插入所有的字段,但事实往往事与愿违,也简单,稍作调整即可 $rows[] = [ 'title' => $model->title, 'content' => $model->content, ]; Yii::$app->db->createCommand()->batchInsert(Post::tableName(), ['title', 'content'], $rows)->execute(); 虽然又回到了batchInsert上,不过没关系,该验证的都验证了,安全是无须担心的。 以上所述是小编给大家介绍的Yii2如何批量添加数据的相关知识,希望对大家有所帮助!

如何在Yii2中插入批量数据库?

我想知道你如何在INSERT做一个批量数据库Yii2

例如一个正常的INSERT我想这样:

$sql = $this->db("INSERT INTO some_table(id,my_value) VALUES(:id,:my_value)");
$sql->bindValues([':id' => $id, ':my_value' => $my_value]);
$sql->execute();

现在如果我想创建一个批量INSERT怎么办?

没有绑定值,你可以这样:

foreach ($foo as $bar) {
    $data_sql .= '(' . $id . ',' "'" . $bar . "'),"
}

$data_sql = rtrim($data_sql, ',');

$sql = $this->db("INSERT INTO some_table(id,my_value) VALUES" . $data_sql);
$sql->execute();

但是如果你仍然想要绑定值,你怎么能实现这个呢?

编辑:这个问题与链接的问题不一样,因为我没有使用ActiveRecord

编辑2:

理想情况下,如果有一个提供一些灵活性的解决方案,例如能够编写您自己的大部分语法,那将是一件好事,作为下面发布的答案之一:

Yii::$app->db->createCommand()->batchInsert('tableName', ['id', 'title', 'created_at'], [
    [1, 'title1', '2015-04-10'],
    [2, 'title2', '2015-04-11'],
    [3, 'title3', '2015-04-12'],
])->execute();

......不提供。对于这种特殊情况,我需要使用上述解决方案不提供的IGNORE语句。

答案

有一个特殊的batchInsert方法:

Yii::$app->db->createCommand()->batchInsert('tableName', ['id', 'title', 'created_at'], [
    [1, 'title1', '2015-04-10'],
    [2, 'title2', '2015-04-11'],
    [3, 'title3', '2015-04-12'],
])->execute();
另一答案

此代码将值绑定为不带ActiveRecord的占位符

Yii::$app->db->createCommand('INSERT INTO some_table (id, my_value) VALUES(:id, :value')
    ->bindValue(':id', $id)
    ->bindValue(':value', $value)
    ->execute();

以上是关于Yii2中的Active Record可以批量插入数据吗的主要内容,如果未能解决你的问题,请参考以下文章

Yii2之Active Record

Yii2 : Active Record 添加 Not In 条件

Yii2 : Active Record add Not In condition

yii2 使用 ActiveRecord 批量插入

Codeigniter Active Record 类插入

Yii2 批量插入