如何使用 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 从单个查询中更新多行?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent:与 groupBy 求和

linux下如何查卡cpu的频率

linux下如何查卡cpu的频率

vbscript 单个单词查缩写

如何使用 CLI 从单个队列中删除所有消息?

如何使用代码点火器从 mysql 获取单个结果? [复制]