【问题标题】:What is the best way to update a group of rows in laravel在 laravel 中更新一组行的最佳方法是什么
【发布时间】:2017-02-07 05:03:00
【问题描述】:

觉得我的桌子是这样的

+--------+-------------------+-----------+
| ID     | Type              |  nOrder   |
+--------+-------------------+-----------+
| 1      | A                 | 0         |
| 2      | A                 | 1         |
| 3      | A                 | 2         |
| 4      | B                 | 0         |
| 5      | B                 | 1         |
| 6      | B                 | 2         |
| 7      | B                 | 3         |
| 8      | B                 | 4         |
| 9      | C                 | 0         |
| 10     | C                 | 1         |
+--------+-------------------+-----------+

我有一个这样的数组

+--------+-------------------+-----------+
| ID     | Type              |  nOrder   |
+--------+-------------------+-----------+
| 5      | A                 | 0         |
| 4      | A                 | 1         |
+--------+-------------------+-----------+

我想用 laravel 中的这些新行更新我的表, 在没有循环的laravel中有什么办法吗?如果不是,我该如何使用 sql 语句来做到这一点。

在 php 和 mysqli 中,我可以创建我所有更新查询的查询,然后将它们发送到一个查询中,一个带有 10 个更新语句的查询,现在我怎么能在 laravel 中做到这一点???

【问题讨论】:

  • 既然有了数组,为什么不想循环呢?您仍然需要循环访问数组内容。
  • 因为循环发送数据库查询不是一个好的解决方案,我只想通过一个查询来完成

标签: php mysql laravel laravel-5


【解决方案1】:

如果您想在 mySQL 中使用单个查询来执行此操作,您有 2 个选项。

选项 1: 像这样使用replace into mysql 构造:

$query = "replace into {$table} values (?, ?, ?), (?, ?, ?)";
$insertArray = [[5, "A", 0], [4, "A", 1]];
DB::insert($query, array_flatten($insertArray));

选项 2: 像这样使用insert into on duplicate key mysql 构造:

$query = "insert into {$table} values (?, ?, ?), (?, ?, ?) on duplicate key update ID = VALUES(ID), Type = VALUES(Type), nOrder = VALUES(nOrder)";
$insertArray = [[5, "A", 0], [4, "A", 1]];
DB::insert($query, array_flatten($insertArray));

这两种构造之间的区别在于替换为 插入(对于新行)或删除然后插入(对于现有行)。 但是,insert into on duplicate key 执行插入新行 并更新现有行

您可以将this package 用于这两个选项

如果您需要执行速度但又不想使用这样的原始查询,另一种选择是使用database transactions

【讨论】:

    【解决方案2】:

    Mass updates

    Model::where('type', 'A')->where('nOrder', '<', 2)->update(['foo' => 'bar'])
    

    您的属性必须在模型中的$fillable 中设置。换句话说,您必须将$fillable = ['foo'] 添加到您的模型中。

    【讨论】:

      【解决方案3】:

      IMO 没有 "laravel way" 可以做这样的事情,在这样的某个级别上,您必须迭代 ArrayLaravel Collection 以更新单个记录。因为这些都是更新,并且每个都有不同的身份列。

      另一方面,如果您的标识列匹配多个记录,laravel 支持Mass Update,即如果您的 where 子句匹配多个元素。

      App\Flight::where('active', 1)
                ->where('destination', 'San Diego')
                ->update(['delayed' => 1]);
      

      【讨论】:

      • 在 php 和 mysqli 中我可以创建我所有更新查询的查询,然后将它们发送到一个查询中,一个带有 10 个更新语句的查询,现在我怎么能在 laravel 中做到这一点???
      • 不,在 laravel 中没有这样的东西。
      【解决方案4】:

      对于每条记录,您只能使用相同的值进行更新。

      $values = [['Type' => 'A'],['nOrder' => '0']];
      DB::table('table_name')->whereIn('id', [4, 5])->update($values);
      

      【讨论】:

      • 这是一个插入,我该如何更新?
      • @AfshinEzadi 您只能为每条记录使用相同的值进行更新。如果您认为这可以通过原始 sql 查询来实现,您可以随时在 laravel 中使用 DB::raw()
      猜你喜欢
      • 2020-04-16
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      相关资源
      最近更新 更多