认为我的桌子就像这样
+--------+-------------------+-----------+
| 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中这样做?
答案 0 :(得分:0)
Model::where('type', 'A')->where('nOrder', '<', 2)->update(['foo' => 'bar'])
您的属性必须在模型的$fillable
中设置。换句话说,您必须将$fillable = ['foo']
添加到模型中。
答案 1 :(得分:0)
IMO 没有"laravel way"
做这样的事情,在某种程度上,你必须迭代Array
或Laravel 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