[英]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"
做这样的事情,在某种程度上,你必须迭代Array
或Laravel 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.