UpdateOrCreate无法使用数组字段

问题描述

这是我在使用UpdateOrCreate和Array时遇到的问题,这是我的控制器,这里的extra_id是数组字段

// log4js.json
{
  "appenders": {
    "cloudWatch": {
      "type": "console","layout": {
        "type": "basic"
      }
    }
  },"categories": {
    "default": {
      "appenders": [
        "cloudWatch"
      ],"level": "debug"
    }
  }
}

在这里,我已经使用Casts将字符串转换为数组,因为我已经在模型中做到了这一点,

 $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')]
                        );
   }

如果extra_id = [1,2],则出现问题,如果出现相同的数据,则会再次创建新记录,而不是更新数量

解决方法

updateOrCreate方法不支持使用分配给属性的数组进行查询。它不会对json字段执行whereIn或特别是whereJsonContains的操作。它将始终采用数组的第一个元素,并分配给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,'extra_id' => $request->extra_id,'qty' => 1
                       ]);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...