查询对象数组(带有 JSONB 的 Postgres、Laravel 5)

Phi*_*ühn 6 php postgresql laravel jsonb laravel-5

我在 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]\n
Run 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();\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我想检查是否drink beerskills并且以下代码不起作用:

\n\n
$users = User::whereRaw("json -> \'skills\' ? \'drink beer\'")->get();\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里我遇到了一个语法错误:

\n\n
SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "$1"\nLINE 1: select * from "users" where json ->> \'skills\' $1 \'drink beer...\n^ (SQL: select * from "users" where json ->> \'skills\' ? \'drink beer\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

我怎样才能搜索drink beer

\n

gre*_*reg 5

正如 Twitter 上的 @tapoueh 所建议的,也许解决方法是使用运算符的底层函数:jsonb_exists(jsonb, text)。所以你的查询是

$users = User::whereRaw("jsonb_exists(json -> 'skills', 'drink beer')")->get();
Run Code Online (Sandbox Code Playgroud)

由@docteur_klein 添加:类似问题的链接