updateOrCreate не работает с полями массива

#php #mysql #laravel #e-commerce #cart

#php #mysql #laravel #электронная коммерция #Корзина

Вопрос:

здесь у меня возникла проблема с использованием update_orcreate с массивом, это мой контроллер, здесь мой extra_id — это поле массива

  $cart =  Cart::updateOrCreate([
                            'user_id'=> $user_id,
                            'product_id'=>$id,
                            'attribute_id'=>$request->attribute_id,
                            'extra_id' => $request->extra_id,
                            ],
                            ['qty'=>DB::raw('qty   1')]
                        );
   }
  

здесь я использовал приведения для преобразования строки в массив, для этого я сделал это в своей модели,

 protected $casts = [
    'extra_id'=>'array'
];
  

и что касается проблемы, если extra_id = [1,2] и снова, если появляются те же данные, создается новая запись вместо обновления количества.

Комментарии:

1. приведение также ожидает, что переданный атрибут будет массивом с ключами, возможно, повторно проверьте, является ли $request-> extra_id массивом, также в базе данных дополнительный идентификатор является объектом JSON

2. $request-> extra_id — это массив, и я сохранил extra_id в формате json в базе данных

Ответ №1:

updateOrCreate метод не поддерживает выполнение запросов с использованием массива, присвоенного атрибуту. Он не будет выполнять whereIn или, особенно, whereJsonContains для полей json. Он всегда будет принимать первый элемент массива и присваивать where условию.

Таким образом, и в вашем случае созданный запрос всегда будет присваивать первый элемент массива extra_id столбцу.

Я бы предложил вручную проверить наличие объекта, а затем обработать обновление и создать отдельно.

 $cart = Cart::where(['user_id'=> $user_id,
                        'product_id'=>$id,
                        'attribute_id'=>$request->attribute_id,
                    ])
              ->whereJsonContains('extra_id', $request->extra_id)
              ->first();

if( $cart ) //will be empty if no result
   $cart->update([
                  'qty' => DB::raw('qty   1') 
                 ]);

else
  $cart = Cart::create(['user_id'=> $user_id,
                        'product_id'=>$id,
                        'attribute_id'=>$request->attribute_id,
                        'extra_id' => $request->extra_id,
                        'qty' => 1
                       ]);
  

Комментарии:

1. в моем случае у меня есть старая база данных, которую я пробовал с тем же случаем, но мои ключи json с читаемыми ключами, такими как [«value1″=> 0, «value2» => 0], каким-то образом это сработало xD

2. Сначала пропущено обращение к json, обновлено для обслуживания полей json.

3. большое вам спасибо, вы сэкономили много моего времени, я собирался реализовать некоторую длинную логику спасибо, я никогда раньше не пользовался WherIn