我已經為此苦苦掙扎了一段時間,但找不到一種干凈的方法來做到這一點,所以我正在尋求幫助。
我在資料庫 API 輸出上有自定義過濾器(ApiPlatform 2.5 和 Symfony 5.1),我需要過濾每個輸出的當前作業流位置或狀態。
Status 具有以下結構,這是 symfony 作業流的位置:
Status = { "OPEN": 1 }
我的問題是狀態作為陣列存盤在資料庫中,我找不到讓查詢構建器找到匹配項的方法。
我嘗試在本地構建一個陣列來執行 = 、 LIKE 或 IN :
$status['OPEN'] = 1;
$queryBuilder->andWhere(sprintf('%s.Status = :st', $rootAlias))
->leftJoin(sprintf('%s.Objs', $rootAlias), 'o')
->andWhere('o.Profile = :p')
->setParameters(array(
'st' => $status,
'p' => $profile
));
但沒辦法:(
我實施了一個有效的解決方法,但我不喜歡它,因為我經常使用作業流并且需要一種干凈的方法來過濾輸出。我的解決方法相當簡單,當狀態被寫入資料庫中的陣列時,我還將它作為字串存盤在另一個名為 StatusText 的欄位中,然后對 StatusText 進行過濾很簡單直接。
狀態顯然可以有不同的內容:OPEN、CLOSING、CLOSED、...
幫助表示贊賞!謝謝
編輯和解決方案
正如 Youssef 所提議的,使用 scienta/doctrine-json-functions 并使用 JSON_EXTRACT :
作曲家需要 scienta/doctrine-json-functions
重要的是,這是我的問題的一部分,使用 Doctrine 型別json_array一個非陣列來存盤狀態或狀態,無論你如何稱呼它,在資料庫中。
集成 ApiPlatform 自定義過濾器中提供的別名:
$rootAlias = $queryBuilder->getRootAliases()[0];
$json_extract_string = "JSON_EXTRACT(".$rootAlias.".Status, '$.OPEN') = 1";
$queryBuilder->andwhere($json_extract_string )
->leftJoin(sprintf('%s.Objs', $rootAlias), 'o')
->andWhere('o.Profile = :p')
->setParameter('p', $profile);
uj5u.com熱心網友回復:
您需要詢問 Doctrine JSON 陣列是否包含狀態,但您不能使用 QueryBuilder 方法做到這一點。當您遇到 ORM 限制時,您可以使用帶有 ResultSetMapping 的本機查詢。它允許您使用 DBMS 的特定功能撰寫純 SQL 查詢,但仍然可以獲取物體物件。或者你可以使用scienta/doctrine-json-functions并使用JSON_EXTRACT
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/356362.html
下一篇:學說EAVorderBy和搜索
