Обновление Laravel DB для первичных ключей работает с необработанным массивом, но не с переменной

Я изначально хотел использовать 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, а не для построителя запросов.

1

Решение

в случае с переменной $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);

Я надеюсь, это поможет вам!

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]