可以Doctrine2 @OrderBy计算字段吗?

时间:2011-06-05 22:24:30

标签: doctrine-orm

我想用模型对我的模型的关联ArrayCollection进行排序,如下所示(我知道以下代码不起作用):

/** 
 * @OneToMany (targetEntity="Review", mappedBy="product") 
 * @OrderBy ({"voted_up / voted_down" = "DESC"})
 */
protected $reviews;

这可能直接在模型定义中出现,还是我需要在请求数据时在ArrayCollection上使用sort()?

1 个答案:

答案 0 :(得分:2)

使用Doctrine 2.1,您可以直接在模型定义中执行此操作,但不能使用@OrderBy。您可以在模型级别定义DQL片段,如2.1 Beta release notes中所述:

元数据中命名的DQL查询:您可以使用@NamedQueries(@NamedQuery(名称=" foo",查询=" DQL")在映射文件中添加dql查询)并通过$ em-> getRepository() - > getNamedQuery()访问它们。

因此,您可以使用ORDER BY关键字创建DQL查询,例如:

SELECT c.id, c.text, (c.voted_up / c.voted_down) AS sortkey FROM Comment c
ORDER BY sortkey DESC

因此,我想你会将这个注释添加到模型定义中,例如:

/**
 * @Entity
 * @Table(name="comment")
 * @NamedQueries(@NamedQuery(name="sortedComment", query="SELECT c.id, c.text, (c.voted_up / c.voted_down) AS sortkey FROM Comment c ORDER BY sortkey DESC"))
 */
 class Comment {
     ...
 }

然后在您的代码调用上:

$em->getRepository("Comment")->getNamedQuery("sortedComment");

我没有测试过这个,但你明白了。