Laravel / PDO JSONPATH запрос на Postgresql - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь сделать запрос 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")))"
]

Кто-нибудь знает, как с этим справиться? ?

С уважением и благодарностью за прочтение.

1 Ответ

0 голосов
/ 14 апреля 2020

Я наконец-то нашел способ сделать это.

$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 @?? '$[*] ? (
 (
  @.idParametre == 4 && @.valeur like_regex \".*555.*\" flag \"i\")
  || exists( @.fields[*] ?
  (
    @.idParametre == 4 && @.valeur like_regex \".*555.*\" flag \"i\"
  )
))'";

$params = [];

$items = DB::connection('pgsql')->select($query, $params);
dd($items);

У вас должно быть php> = 7.4 и экранировать @? как это @??

Для остальной части запроса он не должен использовать параметры, иначе он не будет работать. Просто избегайте "(двойная кавычка) в JSONPATH

...