如何使用 eloquent/fluent 从单个查询中更新多行?
Posted
技术标签:
【中文标题】如何使用 eloquent/fluent 从单个查询中更新多行?【英文标题】:How to update multiple rows from a single query using eloquent/fluent? 【发布时间】:2017-11-28 09:18:51 【问题描述】:我正在学习如何使用 eloquent/fluent 从单个查询中插入多行 and I found the answer here
有人可以分享有关如何在单个查询中更新批量行的任何文档吗?
我的查询如下。
Update tblrole set role = 'Super Admin' where RoleID = 1;
Update tblrole set role = 'Super Admin A' where RoleID = 2;
Update tblrole set role = 'Super Admin B' where RoleID = 3;
Update tblrole set role = 'Super Admin C' where RoleID = 4;
【问题讨论】:
另一种方法是将语句包装在事务中。 【参考方案1】:您可以使用单个 mysql 查询来解决该问题。它可以在 Laravel Eloquent 中使用 DB::raw() 方法实现。
**UPDATE** tblrole **SET** role =
**CASE**
WHEN RoleID = 1 THEN 'Super Admin'
WHEN RoleID = 2 THEN 'Super Admin A'
WHEN RoleID = 3 THEN 'Super Admin B'
WHEN RoleID = 4 THEN 'Super Admin C'
**END**
**WHERE** RoleID in (1,2,3,4);
【讨论】:
我在问题中提到的 id 是样本。我正在寻找像 insert 这样的通用解决方案。【参考方案2】:你不能以简单的方式做这样的事情。您可以轻松地更新具有相同值的多行,但如果您想用不同的值更新 role
列,这将很棘手。
事实上,这样做并没有多大意义,但如果你真的想要它并且你认为这是最好的解决方案,你可以尝试使用此处描述的技术来处理原始查询https://***.com/a/25674827/3593996
【讨论】:
你检查了我的问题中的批量插入链接吗?如果有道理,那为什么不能更新呢? 原因是,我不想为每个更新语句打开/关闭数据库连接。这些语句将循环执行。 为什么你会认为每次更新都“打开/关闭”数据库连接,你可以在同一个实例上运行所有这些查询 @Pankaj 通常你使用相同的数据库连接直到脚本结束,所以如果你运行例如 100 个更新查询,我们都使用相同的数据库连接 知道谁可以像插入一样一次性运行所有更新语句吗?【参考方案3】:您可能会从这个大量插入或更新要点中找到灵感:
/**
* Mass (bulk) insert or update on duplicate for Laravel 4/5
*
* insertOrUpdate([
* ['id'=>1,'value'=>10],
* ['id'=>2,'value'=>60]
* ]);
*
*
* @param array $rows
*/
function insertOrUpdate(array $rows)
$table = \DB::getTablePrefix().with(new self)->getTable();
$first = reset($rows);
$columns = implode( ',',
array_map( function( $value ) return "$value"; , array_keys($first) )
);
$values = implode( ',', array_map( function( $row )
return '('.implode( ',',
array_map( function( $value ) return '"'.str_replace('"', '""', $value).'"'; , $row )
).')';
, $rows )
);
$updates = implode( ',',
array_map( function( $value ) return "$value = VALUES($value)"; , array_keys($first) )
);
$sql = "INSERT INTO $table($columns) VALUES $values ON DUPLICATE KEY UPDATE $updates";
return \DB::statement( $sql );
参考:https://gist.github.com/RuGa/5354e44883c7651fd15c
我认为我不需要提供任何解释,因为函数中的每一段代码都说明了自己。
【讨论】:
以上是关于如何使用 eloquent/fluent 从单个查询中更新多行?的主要内容,如果未能解决你的问题,请参考以下文章