该问题可视为本课题的副本.它确实指出了与PDO相同的问题.但它的解决方案解决方案有点不同,因为目标不同.我将在那里发布JSONB的解决方法和PHP票证的链接.
当我准备以下查询时:
SELECT * FROM post WHERE locations ? :location;
Run Code Online (Sandbox Code Playgroud)
发生以下警告:
警告:PDO :: prepare():SQLSTATE [HY093]:参数号无效:在xx行的/path/file.php中混合命名和位置参数
问号是一个有效的PostgreSQL运算符,但PDO将其视为占位符.
是否有一种正确的方法来配置PDO以忽略问号作为占位符?
我会发布一个下面的解决方法.希望有更好的方法
编辑 我在PHP bug跟踪系统中添加了一个票证
我在 JSONB 字段中获取了以下数据:
\n\n[\n \'first_name\' => \'Philipp\',\n \'last_name\' => \'K\xc3\xbchn\',\n \'size\' => 170,\n \'hobbies\' => [\n \'daily\' => \'beer\',\n ],\n \'skills\' => [\n \'drink beer\',\n \'drink more beer\',\n ],\n]\nRun Code Online (Sandbox Code Playgroud)\n\n我对 Laravel 和 Postgres 还很陌生,所以我想做一些基本的查询。
\n\n以下是一些运行良好的查询:\n(json 是列的名称)
\n\n$users = User::whereRaw("json ->> \'first_name\' = \'Philipp\'")->get();\n\n$users = User::whereRaw("json ->> \'size\' > \'160\'")->get();\n\n$users = User::whereRaw("json #>> \'{hobbies, daily}\' = \'beer\'")->get();\nRun Code Online (Sandbox Code Playgroud)\n\n现在我想检查是否drink beer在skills并且以下代码不起作用:
$users = User::whereRaw("json -> \'skills\' ? \'drink beer\'")->get();\nRun Code Online (Sandbox Code Playgroud)\n\n这里我遇到了一个语法错误:
\n\nSQLSTATE[42601]: …Run Code Online (Sandbox Code Playgroud) 在我的laravel 5应用程序中,我使用的是PostgreSQL的jsonb数据类型,它有?运算符.
但是我无法在我的模型中使用它,因为laravel使用问号作为绑定.
具体来说,在whereRaw()方法中:
$query->whereRaw("jsonb_column ? 'a_key'")
Run Code Online (Sandbox Code Playgroud)
如何在查询中使用问号?
我有my_table带有jsonb列的表sentiments。我需要从此列中删除所有键“10216”和“10191”。
我尝试在 Laravel 中做下一步:
DB::table('my_table')
->whereRaw("sentiments ?| ARRAY['10216', '10191']")
->update([
'sentiments' => DB::raw("sentiments - '10216' - '10191'")
]);
Run Code Online (Sandbox Code Playgroud)
但我有下一个错误:
[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'])
Run Code Online (Sandbox Code Playgroud)
因为正如我所看到的“?” 看起来像参数。如何逃避这个符号?
更新
我也试着写两个问题sentiments ??| ARRAY::
[Illuminate\Database\QueryException]
SQLSTATE[42883]: Undefined function: 7 ??????: ???????? …Run Code Online (Sandbox Code Playgroud)