【问题标题】:Using virtual fields in Doctrine_Query在 Doctrine_Query 中使用虚拟字段
【发布时间】:2010-05-22 17:03:39
【问题描述】:

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

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

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

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

在某些情况下,在执行查询后过滤集合是可行的,但当 Doctrine_Pager 被抛出时,它会在您访问集合之前计算它的偏移量等。

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

【问题讨论】:

    标签: php symfony1 doctrine dql


    【解决方案1】:

    如果你可以在 SQL 中做到这一点,那么你可以在 Doctrine 中做到这一点。所有教义正在做的就是计算出您要放入 DQL 解析器的内容,无论是字符串还是值,然后将其转换为 SQL,然后从结果中对对象进行水合。

    您不能使用 Doctrine_Pager 对非查询对象进行分页,但是您可以使用 sfPager 并将 Doctrine_Collection 的结果作为数组传递给它?在最坏的情况下,您可以将查询结果减去查询中的任何限制传递给它,然后让它处理分页,但这确实效率低下。

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

    【讨论】:

    • 与您上次的建议类似,我最终通过 DQL 语句尽可能多地进行过滤,然后在循环中进一步完善我的 Doctrine_Collection,然后最终将集合传递给我自己的 PagedResults 类,它只是提供了快速偏移到结果的分页偏移(以及索引等的辅助属性)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 2014-11-05
      • 2010-10-10
      相关资源
      最近更新 更多