用于原始查询的 Laravel 批量插入

Posted

技术标签:

【中文标题】用于原始查询的 Laravel 批量插入【英文标题】:Laravel mass insert for raw query 【发布时间】:2018-10-23 05:44:43 【问题描述】:

我有原始查询:

INSERT INTO employee (fk_country_id, employee_id, fk_city_id, password, role, email, joined_at, resigned_at, created_at, updated_at) VALUES (?, ?, (SELECT id FROM city WHERE city.id = ?), ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE email = VALUES(email), joined_at = VALUES(joined_at), resigned_at = VALUES(resigned_at)

我正在执行这样的查询:

DB::insert($query, $parameters);

其中参数的值是数组的形式。

由于 INSERT 和 UPDATE 操作有大量行,我需要优化查询以在单个查询中插入多行的值。

如何在 Laravel 的帮助下优化我的查询?

有一些选项允许使用嵌套数组运行查询,但我无法使用:

DB::insert();

我想避免在 INSERT 操作期间使用“(?, ?, ?), (?, ?, ?)....”。 Laravel 如何促进这类事情以使代码看起来更干净和优化?

【问题讨论】:

我没有正确理解你的问题,但是让自己成为一个数组$data = ['column' => 'value, ...], ..] 并使用Model::insert($data) 我不能使用 Model::insert($data),我需要对插入使用原始查询(使用 DB::insert()),因为查询中有嵌套选择并且 ON DUPLICATE KEY更新部分。所以我基本上是在询问是否支持对原始查询进行批量分配,并且我所说的原始是指原始而不是使用 eloquent 的某种部分原始查询。 看看这个:github.com/yadakhov/insert-on-duplicate-key @JonasStaudenmeir 看起来非常好,唯一的问题是我将内部选择查询作为值之一,我认为他们不支持它,但我会尝试 您找到解决方案了吗? 【参考方案1】:

对于原始批量插入,您可以使用:

DB::unprepared("
    insert into users (email, votes) values ('john@mail.com', 10);
    insert into users (email, votes) values ('jane@mail.com', 12);
");

小心 SQL 注入!

这在测试中快速填充数据库时非常有用。

【讨论】:

【参考方案2】:

你可以使用 Laravel 优化你的代码:

DB::insert('insert into users (id, name) values (?, ?)', array(1, 'Dayle'));

你也可以通过这个链接。对你有帮助。

http://fideloper.com/laravel-raw-queries

如果符合您的解决方案,请将其标记为答案。

【讨论】:

我知道这个解决方案,但我问的是批量插入,即...插入值 (?, ?), (?, ?) ... 然后 [[1, 'Dayle'] , [2, 'Minie']] 一些方法支持这个但不支持 DB::insert afaik 请为您的答案添加一些解释 - 对我来说,给定的查询看起来与问题中的查询非常相似。

以上是关于用于原始查询的 Laravel 批量插入的主要内容,如果未能解决你的问题,请参考以下文章

laravel 5.6批量插入json数据

Laravel 5.2 中的批量插入

批量查询超出速率限制

批量查询超出速率限制

Laravel 数据透视表批量插入多个字段

Laravel 批量插入许多具有相同形式的条目