如何使用eloquent / fluent从单个查询更新多行?

时间:2017-06-25 07:53:43

标签: laravel laravel-5.2 laravel-5.3 laravel-5.4

我正在学习如何使用口才/流利 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;

3 个答案:

答案 0 :(得分:0)

你不能以简单的方式做这样的事情。您可以使用相同的值轻松更新多个行,但如果您想使用不同的值更新role列,则会很棘手。

事实上,这样做并没有多大意义,但是如果你真的想要它并且你认为它是最好的解决方案,你可以尝试使用这里描述的技术来玩原始查询https://stackoverflow.com/a/25674827/3593996

答案 1 :(得分:0)

您可以使用单个MySQL查询解决问题。它可以使用DB :: raw()方法在Laravel Eloquent中实现。

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

答案 2 :(得分:0)

您可以从此批量插入或更新要点中找到灵感:

/**
* 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

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