PHP 查询:将参数设置为 Sql 键以进行 JSON 搜索

PHP Query: Set parameter to an Sql key for JSON search

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

$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->"$.?"这部分是错误的,但我不知道如何在那里传递参数,有什么想法吗?

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

WHERE JSON_EXTRACT('url','$.?') = '?'

你不能像那样绑定到 JSON 路径。来自 manual:

Parameter markers can be used only where data values should appear, not for SQL keywords, identifiers, and so forth.

您需要更改 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);