Laravel DB对主键的更新适用于原始数组,但不适用于变量

时间:2018-08-24 18:30:19

标签: php laravel mass-assignment

我最初想使用Eloquent:

$product->quantity_discounts()
->where('min_amount', $discount['min_amount'])
->where('user_id', $discount['user_id'])
->where('group_id', $discount['group_id'])
->update($discount);

但是Eloquent不支持复合主键(https://github.com/laravel/framework/issues/5355)。

我的代码,使用查询生成器:

DB::table('quantity_discounts')
->where('min_amount', $discount['min_amount'])
->where('user_id', $discount['user_id'])
->where('group_id', $discount['group_id'])
->where('product_id', $id)
->update($discount);

$折扣:

[
    "min_amount" => "2",
    "price" => "20",
    "user_id" => "1",
    "group_id" => "0"
]

唯一更改的字段是价格。所有其他字段都是主键约束的一部分。

enter image description here

但是,准确传递 美元折扣中的内容是可行的。似乎查询生成器不会大量分配值给主键。

查询update($discount)

update `quantity_discounts` set `min_amount` = ?, `price` = ?, `user_id` = ?, `group_id` = ? where `min_amount` = ? and `user_id` = ? and `group_id` = ? and `product_id` = ?

查询update([...])

update `quantity_discounts` set `min_amount` = ?, `price` = ?, `user_id` = ?, `group_id` = ? where `min_amount` = ? and `user_id` = ? and `group_id` = ? and `product_id` = ? 

查询是相同的。数组是相同的。 []有效,但$ discount无效。

如果更改任何主键字段,则价格也不会更改。什么都不会改变。如果仅更改价格,价格将会更改。

enter image description here

尽管使用原始数组[]也可以:

enter image description here

并且数组确实是相同的:

enter image description here

这可能是某种大规模分配保护吗? ["min_amount" => $discount["min_amount"], ...]也不起作用。我将所有字段都设置为$ fillable,但这是针对Eloquent的,不是针对查询生成器的。

1 个答案:

答案 0 :(得分:2)

在变量mynewlist的情况下,我看到一个逻辑错误,这可能是原因,您正在寻找新的ID,而不是旧的ID,如果产品仅提供一个折扣,那么更新就没有之所以起作用,是因为不存在具有新ID的折扣,但是如果您仅更改价格或金额,则更新有效,因为ID并未更改,因此您需要按旧ID搜索并使用变量#[[1]] #[1] 2 3 4 5 2 5 48 4 2 3 4 35 23 3 4 85 2 3 48 5 更新。

$discount

希望对您有所帮助!