Laravel的原始查询批量插入

5

我有一个原始查询:

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);

参数的值以数组形式给出。

由于插入和更新操作所涉及的行数巨大,我需要优化查询,将多个行的值插入单个查询中。

如何借助Laravel优化我的查询?

有一些选项允许使用嵌套数组运行查询,但我无法使用以下代码使其正常工作:

DB::insert();

我希望在INSERT操作期间避免使用"(?, ?, ?), (?, ?, ?)...."。 Laravel如何简化这种操作以使代码更加清晰和优化?


我不能使用Model::insert($data),我需要使用原始查询进行插入(使用DB::insert()),因为查询中有嵌套的select和ON DUPLICATE KEY UPDATE部分。所以我基本上是在问是否支持原始查询的批量赋值,而且我真正意思的“原始”是指完全原始的查询,而不是使用eloquent的某种部分原始查询。 - Srneczek
1
看一下这个:https://github.com/yadakhov/insert-on-duplicate-key - Jonas Staudenmeir
你得到解决方案了吗? - zion
我没有关于那个的任何消息。我想我只是采用了我提到的解决方案。这是两年前的事情了,也许Laravel已经成熟了,现在有更好的解决方案。 - Srneczek
Laravel刚刚发布了upsert函数。我不知道关于批量插入,但它将管理ON DUPLICATE KEY UPDATE。 - Juliatzin
显示剩余2条评论
1个回答

3

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

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

请小心SQL注入攻击!

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


正是我在测试期间填充数据库所需要的。 - bakis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接