Laravel/PDO Postgresql 上的 JSONPATH 请求
Laravel/PDO JSONPATH request on Postgresql
我正在尝试使用 laravel/pdo 在 postgresql 上发出 jsonpath 请求。这是我需要完成的。
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,我清楚地得到了一个带有 2 个参数的请求和带有两个参数的 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")))"
]
有人知道如何处理吗?
向您致以最诚挚的问候并感谢您的阅读。
终于找到方法了
$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
中的 "(双引号)
我正在尝试使用 laravel/pdo 在 postgresql 上发出 jsonpath 请求。这是我需要完成的。
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,我清楚地得到了一个带有 2 个参数的请求和带有两个参数的 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")))"
]
有人知道如何处理吗?
向您致以最诚挚的问候并感谢您的阅读。
终于找到方法了
$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
中的 "(双引号)