2011-06-05 4 views
0

Я хочу, чтобы отсортировать моя модель ассоциированную ArrayCollection с фактор, как это (я знаю, следующий код не работает):Может ли Doctrine2 @OrderBy вычисленное поле?

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

Что-то это можно непосредственно в определении модели или мне нужно просто используйте сортировку() на ArrayCollection при запросе данных?

+0

Вы серьезно используете имя поля как «voted_up/voted_down» как имя? Я не хочу быть суждением. Но я думаю, что это какая-то привязанность. – renoirb

+0

Извините, нет. Чтобы уточнить, это расчет. «voted_up» - это поле int, а «voted_down» - это int. – iamdev

ответ

2

С Doctrine 2.1 вы можете сделать это непосредственно в определении модели, но не с @OrderBy. Вы можете определить DQL фрагменты на уровне модели, как указано в 2.1 Beta release notes:

Названный DQL запросов в метаданных: Вы можете добавить DQL запросов в файлах отображения с использованием @NamedQueries (@NamedQuery (имя = «Foo», запрос = «DQL»)) и получить доступ к ним через $ em-> getRepository() -> getNamedQuery().

Таким образом вы можете создать свой DQL запрос с ORDER BY ключевых слов, что-то вроде:

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

Смежные вопросы