Я пытаюсь сделать запрос jsonpath на postgresql с laravel / pdo. Вот что мне нужно для архивации.
SELECT i.id as id, i.modele_id as modele_id, i.data as data, m.nom as modele_nom
FROM items i
JOIN modeles m ON (i.modele_id = m.id)
WHERE m.id = 2
AND i.data @? '$[*] ? ( (@.idParametre == 4 && @.valeur like_regex ".*555.*" flag "i") || exists( @.fields[*] ? (@.idParametre == 4 && @.valeur like_regex ".*555.*" flag "i")))'
PDO, похоже, имеет проблемы с? (знак вопроса), потому что это символ параметров. Я пытался настроить запрос следующим образом:
$query = "SELECT i.id as id, i.modele_id as modele_id, i.data as data, m.nom as modele_nom FROM items i JOIN modeles m ON (i.modele_id = m.id) WHERE m.id = 2 AND i.data ? '?'";
$params = [
'@?',
'$[*] ? ( (@.idParametre == 4 && @.valeur like_regex ".*555.*" flag "i") || exists( @.fields[*] ? (@.idParametre == 4 && @.valeur like_regex ".*555.*" flag "i")))'
];
$items = DB::connection('pgsql')->select($query, $params);
dd($items);
Но я получил ошибку:
SQLSTATE[HY093]: Invalid parameter number: parameter was not defined (SQL: SELECT i.id as id, i.modele_id as modele_id, i.data as data, m.nom as modele_nom FROM items i JOIN modeles m ON (i.modele_id = m.id) WHERE m.id = 2 AND i.data @? '$[*] ? ( (@.idParametre == 4 && @.valeur like_regex ".*555.*" flag "i") || exists( @.fields[*] ? (@.idParametre == 4 && @.valeur like_regex ".*555.*" flag "i")))')
Это то, где я не понимаю. Собранный запрос - именно то, что я хочу, и если я отображаю $ query и $ params, я получаю запрос с двумя параметрами и массивом params с двумя параметрами:
dd($query, $params);
"SELECT i.id as id, i.modele_id as modele_id, i.data as data, m.nom as modele_nom FROM items i JOIN modeles m ON (i.modele_id = m.id) WHERE m.id = 2 AND i.data ? '?'"
array:2 [
0 => "@?"
1 => "$[*] ? ( (@.idParametre == 4 && @.valeur like_regex ".*555.*" flag "i") || exists( @.fields[*] ? (@.idParametre == 4 && @.valeur like_regex ".*555.*" flag "i")))"
]
Кто-нибудь знает, как с этим справиться? ?
С уважением и благодарностью за прочтение.