Я изначально хотел использовать 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"
]
Единственное изменяемое поле - это цена. Все остальные поля являются частью ограничения первичного ключа.
Тем не менее, передача точно , что находится внутри $ discount, работает. Похоже, что построитель запросов не будет массово присваивать значения первичным ключам.
Запрос для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 нет.
Если изменить какое-либо поле первичного ключа, цена также не изменится. Ничего не изменится. Если изменится только цена, изменится цена.
Хотя использование необработанного массива [] работает:
И массивы действительно идентичны:
Может ли это быть своего рода защитой от массового присвоения?["min_amount" => $discount["min_amount"], ...]
тоже не сработало.Я установил все поля как $ fillable, но это для Eloquent, а не для построителя запросов.