我想知道如何在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
语句。
答案 0 :(得分:25)
有一种特殊的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();
答案 1 :(得分:-1)
此代码将值绑定为不使用ActiveRecord的占位符
\Yii::$app->db->createCommand('INSERT INTO some_table (id, my_value) VALUES(:id, :value')
->bindValue(':id', $id)
->bindValue(':value', $value)
->execute();