Doctrineクエリビルダーを使用してJSON列のフィールドに基づいて選択する方法
P粉423694341
P粉423694341 2024-01-06 16:58:30
0
1
558

ロングテキスト型 (DC2Type:json) の JSON 列を含むテーブルがあります。このテーブルには、Symfony プロジェクトの Doctrine ORM にエンティティがあります。変数 $qb

の Doctrine クエリ ビルダーを使用して、JSON 列内のフィールドに基づいてクエリを実行したいと考えています ###どうすればいいですか?私がオンラインで見つけたものはすべて、この機能を有効にするにはサードパーティのパッケージをインストールする必要があると記載されています。別のパッケージをインストールせずにDoctrineのクエリビルダーだけを使用してそれを行う方法はありますか?

私が試した (おそらく愚かな) 回避策の 1 つは、列を文字列として扱ってから...

リーリー

たとえば、JSON 列

my_data をクエリして、文字列に id":1, を含む BLOB を検索したい場合、これは非常に奇妙な構文エラーで失敗します。いずれにせよ、JSON フィールドにクエリを実行するのは正しくありませんが、SQL クライアントで LIKE クエリを直接実行すると思いどおりに動作するため、Doctrine でなぜこれが失敗するのかわかりません。 編集: これは MySQL/MariaDB です。

P粉423694341
P粉423694341

全員に返信(1)
P粉724737511

Doctrine のクエリ言語は非常に限られています。最も基本的/一般的な SQL 関数のみをカバーしており、99% のユースケースには十分ですが、すべてではありません。

MariaDB のバージョンが JSON をネイティブにサポートしている場合 (10.2 以降など)、ネイティブ関数を使用して JSON データを処理できます。 (そうでない場合は、回避策が唯一の選択肢となり、アプリケーションで追加のフィルタリングが必要になる場合があります)。

これらの関数を DQL で使用できるようにするには、自分で関数を定義するか、scienta/doctrine-json-functions などのサードパーティ ライブラリを実際に使用する必要があります。 (Symfony での使用方法に関するドキュメントがあり、非常に簡単であることに注意してください)。

追加の関数が 1 つだけ必要で、何らかの理由でパッケージ全体が必要ない場合は、その 1 つのクラスをコピーして独自のクラスとして使用できます。

あるいは、DQL を無視して SQL を直接記述することもできますが、その場合、オブジェクトに直接マージしたり、他の Doctrine マジックを使用してデータを操作したりすることはできなくなります。ただし、単純な使用例ではこれで十分です。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート