2010-05-22 22 views
2

有沒有方法可以將基於虛擬字段的邏輯插入到Doctrine_Query中?在Doctrine_Query中使用虛擬字段

我已經在我的模型中定義的虛擬場「的getStatus()」這是我最終會喜歡我的Doctrine_Query在WHERE子句中利用。

... 
->AndWhere('x.status = ?',$status); 

但是,「status」不是表中的列,而是由模型中的業務邏輯計算。

在執行查詢後過濾集合在某些情況下有效,但在Doctrine_Pager引發混合時不起作用,因爲它在計算它的偏移量之前可以訪問集合。

我最好是在修改Doctrine_Collection之後放棄Doctrine_Pager並重建該功能?

回答

0

如果你可以在SQL中做到這一點,你可以在Doctrine中做到這一點。所有的原則都在做的是,你在DQL解析器中輸入什麼,不管是字符串還是值,然後把它變成SQL,然後從結果中提取對象。

不能使用Doctrine_Pager對非查詢對象頁面,但是你可以使用sfPager並傳遞給它的Doctrine_Collection的結果作爲一個數組?在最糟糕的情況下,您可以將查詢結果減去查詢的任何限制並讓它處理分頁,但這實際上效率很低。

編寫尋呼機「舊skool」可能會更快,就像你會在普通的舊PHP中一樣。

+0

類似於您最後一個建議,我結束了篩選,就像我可以通過該DQL語句,然後進一步完善在一個循環我Doctrine_Collection,最後經過收集到我自己的PagedResults類只是提供了快速的偏移來分頁偏移結果(以及幫助者屬性等等) – 2010-05-26 00:19:05

0

我真的不知道你要申請什麼樣的業務邏輯制定出狀態,但如果它不是生活(如,每個請求計算),我會計算它的保存(使用學說記錄監聽器或者只是模型中的preSave/preInsert掛鉤)並將其存儲在表中,或者設置symfony任務以定期刷新它並將其作爲cronjob運行。這可以讓你在Doctrine中查詢它,並且提升性能作爲附帶利益。

另外,如果狀態是依賴於相關對象的狀態,你可以把他們的事件觸發時,他們正在修改,更新父對象的狀態。沒有更多上下文,很難推薦最佳方法。 :)