Я изначально хотел использовать 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"]
Единственное поле, которое меняется, это цена. Все остальные поля являются частью ограничения первичного ключа.
Однако, проходя именно так Что внутри $ скидка работает. Похоже, что построитель запросов не будет массово присваивать значения первичным ключам.
Запрос для 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` = ?
Запросы идентичны. Массивы идентичны. [] работает, но $ скидка — нет.
Если поле первичного ключа будет изменено, цена также не изменится. Ничего не изменится. Если будет изменена только цена, цена изменится.
Хотя использование необработанного массива [] работает:
И массивы действительно идентичны:
Может ли это быть своего рода защита массовых назначений? ["min_amount" => $discount["min_amount"], ...]
тоже не работал Я установил все поля как $ fillable, но это для Eloquent, а не для построителя запросов.
в случае с переменной $discount
Я вижу логическую ошибку, которая может быть причиной, вы ищете новые идентификаторы, а не старые, если у продукта есть только одна скидка, то обновление не работает, потому что не существует скидки с новыми идентификаторами, но если вы меняете только цену или сумму, обновление работает, потому что идентификаторы не изменились, поэтому вам нужно искать по старым идентификаторам и обновлять с переменной $discount
,
DB::table('quantity_discounts')
->where('min_amount', $discount['min_amount'])
->where('user_id', $old['user_id'])
->where('group_id', $old['group_id'])
->where('product_id', $id)
->update($discount);
Я надеюсь, это поможет вам!
Других решений пока нет …