繁体   English   中英

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

[英]What is the best way to update a group of rows in laravel

我觉得我的桌子是这样的

+--------+-------------------+-----------+
| 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 ???

群发更新怎么样?

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

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

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

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

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

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

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

如果您想在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: 在复制键 mysql构造中使用insert into,如下所示:

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

两个构造之间的区别在于替换为插入(对于新行)或删除然后插入(对于现有行)。 但是,插入复制键会为新行执行插入并更新现有行

您可以将此包用于这两个选项

另一种方法是,如果您需要执行速度但又不想使用这样的原始查询,那就是使用数据库事务

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM