在laravel中更新一组行的最佳方法是什么

时间:2017-02-05 12:58:51

标签: php mysql laravel laravel-5

认为我的桌子就像这样

+--------+-------------------+-----------+
| 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 statment做。

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

4 个答案:

答案 0 :(得分:0)

Mass updates

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

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

答案 1 :(得分:0)

IMO 没有"laravel way"做这样的事情,在某种程度上,你必须迭代ArrayLaravel Collection来更新个别记录。因为这些是更新,每个都有不同的标识列。

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

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

答案 2 :(得分:0)

您只能为每条记录更新相同的值。

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

答案 3 :(得分:0)

如果您想在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(用于新行)或删除然后插入(对于现有行)。   但是,插入复制键会为新行执行插入   并更新现有行

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

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