查询对象数组(带有 JSONB 的 Postgres,Laravel 5)
Query array of objects (Postgres with JSONB, Laravel 5)
我在 JSONB 字段中得到了这些数据:
[
'first_name' => 'Philipp',
'last_name' => 'Kühn',
'size' => 170,
'hobbies' => [
'daily' => 'beer',
],
'skills' => [
'drink beer',
'drink more beer',
],
]
我对 Laravel 和 Postgres 还很陌生,所以我想做一些基本的查询。
以下是一些运行良好的查询:
(json 是列名)
$users = User::whereRaw("json ->> 'first_name' = 'Philipp'")->get();
$users = User::whereRaw("json ->> 'size' > '160'")->get();
$users = User::whereRaw("json #>> '{hobbies, daily}' = 'beer'")->get();
现在我想检查 drink beer
是否在 skills
中并且以下代码不起作用:
$users = User::whereRaw("json -> 'skills' ? 'drink beer'")->get();
这里我遇到语法错误:
SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near ""
LINE 1: select * from "users" where json ->> 'skills' 'drink beer...
^ (SQL: select * from "users" where json ->> 'skills' ? 'drink beer')
如何搜索 drink beer
?
正如推特上@tapoueh 所建议的那样,解决方法可能是使用运算符的基础函数:jsonb_exists(jsonb, text)
。所以你的查询是
$users = User::whereRaw("jsonb_exists(json -> 'skills', 'drink beer')")->get();
由@docteur_klein 添加:A link to a similar problem。
如果您需要 LIKE 搜索,请使用:
\DB::table('users')
->whereRaw("json::json->>'skills' like '%drive a car%'")
->get();
有
Laravel 5.6+ 在 JSON 中搜索变得非常容易
https://laravel.com/api/5.6/Illuminate/Database/Query/Builder.html#method_whereJsonContains
User::WhereJsonContains('json->skills', 'drink beer')->get();
如果您需要在对象数组中搜索值项,您可以像这样转义字符串:
$query = "column @> '{\"INDEX_OF_ARRAY\":[{\"INDEX_OF_OBJECT\": \"".$searched_value."\"}]}'";
$colection = YourModel::whereRaw($query);
$colection->get();
我在 JSONB 字段中得到了这些数据:
[
'first_name' => 'Philipp',
'last_name' => 'Kühn',
'size' => 170,
'hobbies' => [
'daily' => 'beer',
],
'skills' => [
'drink beer',
'drink more beer',
],
]
我对 Laravel 和 Postgres 还很陌生,所以我想做一些基本的查询。
以下是一些运行良好的查询: (json 是列名)
$users = User::whereRaw("json ->> 'first_name' = 'Philipp'")->get();
$users = User::whereRaw("json ->> 'size' > '160'")->get();
$users = User::whereRaw("json #>> '{hobbies, daily}' = 'beer'")->get();
现在我想检查 drink beer
是否在 skills
中并且以下代码不起作用:
$users = User::whereRaw("json -> 'skills' ? 'drink beer'")->get();
这里我遇到语法错误:
SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near ""
LINE 1: select * from "users" where json ->> 'skills' 'drink beer...
^ (SQL: select * from "users" where json ->> 'skills' ? 'drink beer')
如何搜索 drink beer
?
正如推特上@tapoueh 所建议的那样,解决方法可能是使用运算符的基础函数:jsonb_exists(jsonb, text)
。所以你的查询是
$users = User::whereRaw("jsonb_exists(json -> 'skills', 'drink beer')")->get();
由@docteur_klein 添加:A link to a similar problem。
如果您需要 LIKE 搜索,请使用:
\DB::table('users')
->whereRaw("json::json->>'skills' like '%drive a car%'")
->get();
有 Laravel 5.6+ 在 JSON 中搜索变得非常容易
https://laravel.com/api/5.6/Illuminate/Database/Query/Builder.html#method_whereJsonContains
User::WhereJsonContains('json->skills', 'drink beer')->get();
如果您需要在对象数组中搜索值项,您可以像这样转义字符串:
$query = "column @> '{\"INDEX_OF_ARRAY\":[{\"INDEX_OF_OBJECT\": \"".$searched_value."\"}]}'";
$colection = YourModel::whereRaw($query);
$colection->get();