suchen

Heim  >  Fragen und Antworten  >  Hauptteil

So wählen Sie mithilfe des Doctrine Query Builder basierend auf Feldern in einer JSON-Spalte aus

Ich habe eine Tabelle mit einer JSON-Spalte vom Typ Langtext (DC2Type:json). Die Tabelle hat eine Entität im Doctrine ORM in meinem Symfony-Projekt. Ich möchte eine Abfrage basierend auf einem Feld in einer JSON-Spalte mit dem Doctrine Query Builder in der Variablen $qb

durchführen

Was soll ich tun? Alles, was ich online gefunden habe, besagt, dass man ein Paket eines Drittanbieters installieren muss, um diese Funktion zu aktivieren. Gibt es eine Möglichkeit, dies nur mit dem Abfrage-Builder von Doctrine zu tun, ohne ein anderes Paket zu installieren?

Eine (vielleicht dumme) Problemumgehung, die ich versucht habe, bestand darin, die Spalte als Zeichenfolge zu behandeln und ...

$qb->andWhere("my_data LIKE "%id:\"1,%"");

Zum Beispiel, wenn ich die JSON-Spalte my_data 以查找字符串中包含 id":1, nach einem Blob abfragen möchte. Dies schlägt mit einem sehr seltsamen Syntaxfehler fehl und ist ohnehin nicht die richtige Methode zum Abfragen der JSON-Felder. Das Ausführen der LIKE-Abfrage direkt im SQL-Client funktioniert jedoch so, wie ich es möchte, daher weiß ich auch nicht, warum dies in Doctrine fehlschlägt.

EDIT: Das ist MySQL/MariaDB.

P粉423694341P粉423694341356 Tage vor571

Antworte allen(1)Ich werde antworten

  • P粉724737511

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

    Doctrine 查询语言非常有限。它仅涵盖最基本/常见的 SQL 函数,足以满足 99% 的用例,但不是全部。

    如果您的 MariaDB 版本本身支持 JSON(例如 10.2 或更高版本),您可以使用 原生函数来处理 JSON 数据。 (如果您不这样做,那么您的解决方法是唯一的选择,可能需要在应用程序中进行一些额外的过滤)。

    为了能够在 DQL 中使用这些函数,您需要自己定义它们< /a> 或者确实使用第三方库,例如 scienta/doctrine-json-functions (请注意,有关于如何将它与 Symfony 一起使用的文档,而且非常简单)。

    如果您只需要一个额外的函数,并且出于某种原因不需要整个包,您可以复制该单个类并将其用作您自己的类。

    或者,您可以放弃 DQL 并直接编写 SQL,但这样您就无法直接合并为对象并使用其他 Doctrine 魔法来处理数据。但对于简单的用例来说这已经足够了。

    Antwort
    0
  • StornierenAntwort