【问题标题】:How to do a bulk database insert in Yii2?如何在 Yii2 中进行批量数据库插入?
【发布时间】:2015-06-17 07:43:18
【问题描述】:

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

例如一个普通的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 语句。

【问题讨论】:

  • 创建类似INSERT INTO some_table(id,my_value) VALUES (?, ?),(?, ?),(?, ?),(?, ?) 的内容并填充占位符?
  • 嗯,我曾想过通过在每个占位符的末尾附加数字来做类似的事情,但希望有更好的方法。

标签: mysql yii yii2


【解决方案1】:

有一个特殊的 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();

【讨论】:

  • 我认为这不会做任何验证
  • 我认为这与您绑定不需要在传入数据之前清理数据的值时具有相同的安全性?另外,不幸的问题是它不是很灵活,比如如果你想在查询中使用其他东西,比如INSERT IGNORE
  • 此方法是安全的,因为它使用特殊方法进行值引用。如果您需要,您可以提取其最终的 sql 查询并进行更改。
  • 我假设如果您提取查询然后在语句中使用诸如IGNORE 之类的东西,您需要执行str_replace 之类的str_replace('INSERT', 'INSERT IGNORE', $query)
  • 是的,我会试试这个。
【解决方案2】:

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

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

【讨论】:

  • 如果你想从其他表中插入值并包含一些验证,这个概念实际上很好。示例:``` \Yii::$app->db->createCommand(' INSERT INTO table (id, value) SELECT id, value FROM other_table WHERE condition > :something ', [ ':something' => $value ] )->执行(); ```
猜你喜欢
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多