使用"?|"执行查询操作者

时间:2016-12-26 15:08:21

标签: php postgresql laravel pdo laravel-5.3

我有my_tablesentiments的表DB::table('my_table') ->whereRaw("sentiments ?| ARRAY['10216', '10191']") ->update([ 'sentiments' => DB::raw("sentiments - '10216' - '10191'") ]); 。我需要删除所有密钥' 10216'和' 10191'从这一栏。

我尝试在Laravel中做下一步:

[Illuminate\Database\QueryException]                                                                                 
  SQLSTATE[42601]: Syntax error: 7 ОШИБКА:  ошибка синтаксиса (примерное положение: "$1")                              
  LINE 1: ...= sentiments - '10216' - '10191' where sentiments $1| ARRAY[...                                           
                                                               ^ (SQL: update "my_table" 
    set "sentiments" = sentiments - '10216' - '10191' 
    where sentiments ?| ARRAY['10216', '10191'])

但我有下一个错误:

sentiments ??| ARRAY

因为我看到"?"看起来像参数。如何逃避这个符号?

更新

我还尝试写两个问题:[Illuminate\Database\QueryException] SQLSTATE[42883]: Undefined function: 7 ОШИБКА: оператор не существует: jsonb ??| text[] LINE 1: ...= sentiments - '10216' - '10191' where sentiments ??| ARRAY[... ^ HINT: Оператор с данными именем и типами аргументов не найден. Возможно, вам следует добавить явные приведения тип ов. (SQL: update "my_table" set "sentiments" = sentiments - '10216' - '10191' where sentiments ??| ARRAY['10216', '10191'])

{{1}}

2 个答案:

答案 0 :(得分:2)

感谢@degr!它适用于未记录的函数jsonb_exists_any()

DB::table('my_table')
    ->whereRaw("jsonb_exists_any(sentiments, ARRAY['10216', '10191'])")
    ->update([
        'sentiments' => DB::raw("sentiments - '10216' - '10191'")
    ]);

<强>更新

使用此方法,与使用运算符?|不同,不使用jsonb字段上的索引。

答案 1 :(得分:1)

亲爱的朋友,您可以使用

  

创建操作员〜@&(LEFTARG = jsonb,RIGHTARG = text [],PROCEDURE = jsonb_exists_any)

并使用

这样编写查询
DB::table('my_table')
->whereRaw("sentiments ~@& ARRAY['10216', '10191']")
->update([
    'sentiments' => DB::raw("sentiments - '10216' - '10191'")
]);