0

我这里有个问题,我的代码是:

$query = $con2->createQueryBuilder()->select('*')
                ->from('`blog_entry`', 'p')
                ->where('WHERE url->"$.?" = ?')
                ->setParameter(0, $request->getLocale())
                ->setParameter(1, $entryUrl);

url 字段是一个 JSON 字段,它包含这样的内容: {"es": "url.html"}

但它出现了下一个错误:

SQLSTATE[HY093]:无效的参数号:绑定变量的数量与标记的数量不匹配

我认为那部分url->"$.?" 是错误,但我不知道如何在那里传递参数,有什么想法吗?

4

2 回答 2

2

您不能绑定到这样的 JSON 路径。从手册

参数标记只能用于应出现数据值的地方,不能用于 SQL 关键字、标识符等。

您将需要更改where()调用以包含路径,并删除该参数值:

$query = $con2->createQueryBuilder()->select('*')
                ->from('`blog_entry`', 'p')
                ->where('WHERE url->"$.' . $request->getLocale() . '" = ?')
                ->setParameter(0, $entryUrl);

更新

受 FMK 的启发,我在自己的服务器上做了一些测试,发现这会起作用:

$query = $con2->createQueryBuilder()->select('*')
                ->from('`blog_entry`', 'p')
                ->where('WHERE JSON_EXTRACT(url, ?) = ?')
                ->setParameter(0, '"$.' . $request->getLocale() . '"')
                ->setParameter(1, $entryUrl);
于 2019-05-07T09:20:49.530 回答
0

你有没有尝试过这样的事情:

WHERE JSON_EXTRACT('url','$.?') = '?'
于 2019-05-07T09:15:13.033 回答