2011-04-19 52 views
4

我知道條件過濾器尚不可用於查詢(按照「26.1.4。在Doctrine2手冊的已知限制」部分中應用過濾規則),所以我想問專家他們對以下問題的首選解決方案是:原則加入過濾器

我的網站有產品對象,每個對象都有很多評論。評論有一個狀態欄。我不希望在Doctrine2非常出色地完成自動關聯期間不必要地提交未經批准的評論。

我目前的解決方案/黑客是一個鑑別使用單表繼承(STI)的「狀態」,並有根據「認可」

我要補充一點,我的狀態的ApprovedProductReview擴展ProductReview類我目前只需撥打
$em->find('Entities\Product', $pid);
以獲得我的產品,Doctrine2自動執行所有關聯。我應該通過提供DQL查詢來實例化產品嗎?

我會怎樣真的像是一種重寫Doctrine2基於註釋提供的魔法,並且簡單地能夠使用DQL來懶惰地獲得正確的評論子集。

對此提出建議?

+0

我以前的解決方案是'過濾器()''的使用ArrayCollection'封閉按照使用說明書正確設置,但我覺得這是浪費 - 檢索所有額外的數據只是在PHP端進行過濾。 – iamdev 2011-04-19 03:26:55

回答

3

可以使用WITH聲明DQL:

$dql = "SELECT p, r 
     FROM Entities\Product p 
     LEFT JOIN p.reviews r WITH r.status = :status 
     WHERE p.id = :id" 

$q = $em->createQuery($dql); 
$q->setParameter('id', $id); 
$q->setParameter('status', $status); 
$product = $q->getSingleResult(); 
+0

有沒有一種方法可以使用這樣的DQL查詢來重寫Doctrine2在設置關聯時使用的「魔術」? – iamdev 2011-04-19 05:38:50

+0

我現在明白了 - 這取代了之前用於創建產品的「find()」。謝謝Rojoca! – iamdev 2011-04-19 07:22:08