ホームページ  >  に質問  >  本文

Doctrineクエリビルダーを使用してJSON列のフィールドに基づいて選択する方法

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

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

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

リーリー

たとえば、JSON 列

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

P粉423694341P粉423694341310日前512

全員に返信(1)返信します

  • P粉724737511

    P粉7247375112024-01-07 11:55:28

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

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

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

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

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

    返事
    0
  • キャンセル返事