Обновление Laravel DB для первичных ключей работает с необработанным массивом, но не с переменной - PullRequest
0 голосов
/ 24 августа 2018

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

Тем не менее, передача точно , что находится внутри $ 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 нет.

Если изменить какое-либо поле первичного ключа, цена также не изменится. Ничего не изменится. Если изменится только цена, изменится цена.

enter image description here

Хотя использование необработанного массива [] работает:

enter image description here

И массивы действительно идентичны:

enter image description here

Может ли это быть своего рода защитой от массового присвоения?["min_amount" => $discount["min_amount"], ...] тоже не сработало.Я установил все поля как $ fillable, но это для Eloquent, а не для построителя запросов.

1 Ответ

0 голосов
/ 24 августа 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...