在Doctrine_Query中使用虚拟字段

时间:2010-05-22 17:03:39

标签: php symfony1 doctrine dql

有没有办法将基于虚拟字段的逻辑插入到Doctrine_Query中?

我在我的模型中定义了一个虚拟字段“getStatus()”,我最终希望在Doctrine_Query的Where子句中使用它。

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

“status”不是表中的列,而是由模型中的业务逻辑计算的。

在执行查询后过滤集合在某些情况下有效,但在混合中抛出Doctrine_Pager时不会,因为它在您访问集合之前计算它的偏移等。

我最好放弃Doctrine_Pager并在修改Doctrine_Collection后重建该功能吗?

2 个答案:

答案 0 :(得分:0)

如果您可以在SQL中执行此操作,则可以在Doctrine中执行此操作。所有的学说都在研究你在DQL解析器中所做的事情,无论是字符串还是值,然后将其转换为SQL,然后从结果中保护对象。

你不能使用Doctrine_Pager来寻呼非查询对象,但你可以使用sfPager并将Doctrine_Collection的结果作为数组传递给它吗?在最坏的情况下,您可以将查询结果传递给查询,减去查询中的任何限制,并让它处理分页,但这实际上效率很低。

像普通的旧PHP一样编写寻呼机“旧skool”可能会更快。

答案 1 :(得分:0)

我真的不知道你应用什么业务逻辑来计算状态,但如果它不是实时的(如每个请求计算的那样),我会在保存时计算它(使用Doctrine Record Listener或者只需在模型中使用preSave / preInsert挂钩并将其存储在表中,或者设置symfony任务以定期刷新它并将其作为cronjob运行。这样你就可以在Doctrine中查询它,并将性能提升为附带福利。

或者,如果status取决于相关对象的状态,则可以在它们上放置一个事件触发器,以便在修改父对象时更新它们的状态。没有更多背景,很难推荐最佳方法。 :)