【问题标题】:How to update multiple rows from a single query using eloquent/fluent?如何使用 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;

【问题讨论】:

  • 另一种方法是将语句包装在事务中。

标签: laravel laravel-5.2 laravel-5.3 laravel-5.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://stackoverflow.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

我认为我不需要提供任何解释,因为函数中的每一段代码都说明了自己。

【讨论】:

    猜你喜欢
    • 2015-06-25
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多