Я использую Symfony 2 PR12 с Doctrine 2 и MySQL.У меня есть база данных, в которой хранятся статьи и просмотры этих статей:
// ...
class Article {
/**
* @orm:Column(type="bigint")
* @orm:Id
* @orm:GeneratedValue
* @var int
*/
protected $id;
/**
* @orm:OneToMany(targetEntity="ArticleView",mappedBy="article")
* @var ArrayCollection
*/
protected $views;
// ...
}
// ...
class ArticleView {
/**
* @orm:Column(type="bigint")
* @orm:Id
* @orm:GeneratedValue
* @var int
*/
protected $id;
/**
* @orm:Column(type="bigint",name="DateRead",nullable=true)
* @var int
*/
protected $viewDate;
/**
* @orm:ManyToOne(targetEntity="Article",inversedBy="views")
* @var Article
*/
protected $article;
// ...
}
Я хочу получить, например, 20 самых последних просмотренных статей.Моей первой мыслью было бы что-то вроде:
$qb = <instance of Doctrine\ORM\QueryBuilder>;
$qb->select('a')
->from('Article', 'a')
->join('a.views', 'v')
->orderBy('v.viewDate', 'DESC')
->groupBy('a.id')
->setMaxResults(20)
;
Однако, когда с статьей связано более одного вида, комбинация упорядочение / группировка по дает непредсказуемые результаты для упорядочения.
Это ожидаемое поведение для MySQL, так как группировка обрабатывается перед упорядочением, и есть рабочие решения для необработанных запросов в http://www.artfulsoftware.com/infotree/mysqlquerytree.php (Агрегаты -> Внутригрупповые агрегаты).Но я не могу понять, как перевести какое-либо из этих решений на DQL, поскольку, насколько я могу судить, нет способа выбрать из подзапросов или выполнить самоисключение.
Любые идеи о том, как решитьпроблема с разумной производительностью?