поиск по массиву объектов postgres
есть колонка типa json. в ней хранятся данные вида
и я хочу сделать поиск по ключю Ref_Key в объекте. я пробовал делать поиск с eloquent таким образом
SystemInfo::select('functionsss')->whereJsonContains('functionsss', [['Ref_Key' => '1837117a-419b-11ea-bf13-005056a43b58']])->get()
и пробовал делать такой прямой запрос
select * from "system_infos" where ("functionsss")::jsonb @> '[{"Ref_Key": "1837117a-419b-11ea-bf13-005056a43b58"}]'
но ни то ни другое не дало ожидаемый результат. погуглив так же не нашел работающего решения.
p.s. так же нужно получить оттуда все уникальные значения свойства Ref_Key, ну т.е. как если бы GROUP BY но с свойством объекта. так же не получилось. если не ответят в текущем, это будет новый вопрос
Ответы (1 шт):
при записи в бд я сохранял значения этой колонки используя на массиве объектов json_encode(). так
$systemInfo['functions'] = json_encode($functionsss)
а надо было так
$systemInfo['functions'] = $functionsss
после того как поменял. значения в бд стали выглядеть так

возможно дело было в экранировании
а прибаутку с GROUP BY можно добиться с помощью DISTINCT. я сделал это так
SELECT DISTINCT ON (functions->>'Description', functions->>'Ref_Key') functions
FROM (
SELECT functions::jsonb AS si_functions_column from system_infos
) function_colunmn
, jsonb_array_elements(function_colunmn.si_functions_column) WITH ORDINALITY t(functions)
ORDER BY functions->>'Description', functions->>'Ref_Key';
