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 に答える