首頁  >  問答  >  主體

如何使用Doctrine查詢建構器基於JSON列中的欄位進行選擇

我有一個有 JSON 欄位的表,它的類型是 longtext (DC2Type:json)。表格在我的 Symfony 專案中的 Doctrine ORM 中有一個實體。我想使用變數 $qb

中的 Doctrine 查詢建構器基於 JSON 列內的欄位進行查詢

我該怎麼做?我在網路上找到的所有內容都說要安裝第 3 方軟體包才能啟用此功能。有沒有辦法只使用 Doctrine 的查詢產生器而不安裝另一個套件來完成它?

我嘗試過的一個(也許是愚蠢的)解決方法是將列視為字串,然後...

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

例如,如果我想查詢JSON 列my_data 以查找字串中包含id":1, 的blob。這會失敗,並出現非常奇怪的語法錯誤,並且不正確無論如何,查詢JSON 欄位的方法。但是,直接在SQL 用戶端中執行LIKE 查詢可以按照我想要的方式工作,所以我也不知道為什麼這在Doctrine 中失敗。

編輯:這是 MySQL / MariaDB。

P粉423694341P粉423694341261 天前464

全部回覆(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 一起使用的文檔,非常簡單)。

    如果您只需要一個額外的函數,並且出於某種原因不需要整個套件,您可以複製該單一類別並將其用作您自己的類別。

    或者,您可以放棄 DQL 並直接編寫 SQL,但這樣您就無法直接合併為物件並使用其他 Doctrine 魔法來處理資料。但對於簡單的用例來說這已經足夠了。

    回覆
    0
  • 取消回覆