Doctrine 的查询语言有访问对象方法的技巧吗?

Posted

技术标签:

【中文标题】Doctrine 的查询语言有访问对象方法的技巧吗?【英文标题】:Is there a trick with Doctrine's Query Language to access object methods? 【发布时间】:2011-03-19 14:20:53 【问题描述】:

我想在我的 DQL 中订购我的实体类上的一些方法(计算创建和截止日期之间的时间间隔等)。我尝试使用 __get 将方法作为属性访问,但似乎 DQL 使用 get_object_properties 或类似的,所以这不起作用。

无效的查询示例:SELECT t FROM Entity\Task t ORDER BY t.TTL ASC,其中 TTL 是通过返回 getTTL()__get() 访问的。

有什么技巧可以让我以这种方式访问​​它们,还是我自己对结果集进行排序会更好?

【问题讨论】:

【参考方案1】:

不可能。要按计算值排序,请预先计算值并将它们存储在字段中。预先计算值将获得更高效和响应更快的查找的额外好处。

请记住,DQL 映射到 SQL。要执行您的要求,DQL 必须从整个表中检索每条匹配记录,将它们水合到您的实体对象中,运行您的函数,然后在内存中排序(或重新运行查询)。这是个好主意,但它不会奏效。

如果您不喜欢预先计算值的想法,对于大多数这些计算,您可能还可以在 DQL 中内联计算它们 - 即按两个字段值之间的差异排序。重要的一点是它必须内联在 DQL 中,而不是在实体对象上调用计算函数。

【讨论】:

好的,我现在明白一点了——谢谢你的解释!

以上是关于Doctrine 的查询语言有访问对象方法的技巧吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何检索包含所有关系记录的 Doctrine 记录?

Doctrine2 - (如何)使用 main 获取关联对象

有人可以建议一种使用带有多个“where”子句的 Doctrine (QueryBuilder) 进行此查询的方法吗?

Doctrine queryBuilder:返回对象而不是数组

具有非默认语言的 Doctrine i18n 上的 getTitle()

Doctrine Query Builder,“between”表达式和子查询