2011-06-05 101 views
0

我想整理我的模型的关联ArrayCollection有商,像这样(我知道下面的代码不工作):Doctrine2 @OrderBy计算字段?

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

在模型中定义的东西这可能直接或者我需要简单地请求数据时在ArrayCollection上使用sort()?

+0

您是否认真使用字段名称作为“voted_up/voted_down”作为名称?我不想做出评判。但我认为这是某种堕落。 – renoirb 2012-10-04 15:42:07

+0

对不起,没有。澄清,这是一个计算。 “voted_up”是一个int字段,“voted_down”是一个int字段。 – iamdev 2012-10-26 14:05:25

回答

2

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

命名DQL查询在元数据:可以使用@NamedQueries(@NamedQuery(name =“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"); 

我没有测试日是,但你明白了。

+0

这是个好消息!我仍然在使用2.0,所以我会在等待稳定2.1的时候破解一个解决方案。非常感谢您的答案! – iamdev 2011-06-07 20:08:46