Я получил эти данные в поле 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 "$1"LINE 1: select * from "users" where json ->> 'skills' $1 '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: Ссылка на похожую проблему.
С
Laravel 5.6+ поиск в формате JSON становится действительно простым
https://laravel.com/api/5.6/Illuminate/Database/Query/Builder.html#method_whereJsonContains
User::WhereJsonContains('json->skills', 'drink beer')->get();
Если вам нужен LIKE поиск, то используйте это:
\DB::table('users')
->whereRaw("json::json->>'skills' like '%drive a car%'")
->get();