我有一個(gè)有 JSON 欄位的表,它的類型是 longtext (DC2Type:json)。表格在我的 Symfony 專案中的 Doctrine ORM 中有一個(gè)實(shí)體。我想使用變數(shù) $qb
我該怎麼做?我在網(wǎng)路上找到的所有內(nèi)容都說要安裝第 3 方軟體包才能啟用此功能。有沒有辦法只使用 Doctrine 的查詢產(chǎn)生器而不安裝另一個(gè)套件來完成它?
我嘗試過的一個(gè)(也許是愚蠢的)解決方法是將列視為字串,然後...
$qb->andWhere("my_data LIKE "%id:\"1,%"");
例如,如果我想查詢JSON 列my_data
以查找字串中包含id":1,
的blob。這會(huì)失敗,並出現(xiàn)非常奇怪的語法錯(cuò)誤,並且不正確無論如何,查詢JSON 欄位的方法。但是,直接在SQL 用戶端中執(zhí)行LIKE 查詢可以按照我想要的方式工作,所以我也不知道為什麼這在Doctrine 中失敗。
編輯:這是 MySQL / MariaDB。
Doctrine 查詢語言非常有限。它僅涵蓋最基本/常見的 SQL 函數(shù),足以滿足 99% 的用例,但不是全部。
如果您的 MariaDB 版本本身支援 JSON(例如 10.2 或更高版本),您可以使用 原生函數(shù)來處理 JSON 資料。 (如果您不這樣做,那麼您的解決方法是唯一的選擇,可能需要在應(yīng)用程式中進(jìn)行一些額外的過濾)。
為了能夠在DQL 中使用這些函數(shù),您需要自己定義它們 或確實(shí)使用第三方函式庫,例如scienta/doctrine-json-functions (請(qǐng)注意,有關(guān)如何將它與Symfony 一起使用的文檔,非常簡(jiǎn)單)。
如果您只需要一個(gè)額外的函數(shù),並且出於某種原因不需要整個(gè)套件,您可以複製該單一類別並將其用作您自己的類別。
或者,您可以放棄 DQL 並直接編寫 SQL,但這樣您就無法直接合併為物件並使用其他 Doctrine 魔法來處理資料。但對(duì)於簡(jiǎn)單的用例來說這已經(jīng)足夠了。