public function getListByCriteria(SlideshowCriteria $criteria)
{
$qb = $this->createQueryBuilder('p');
$qb->select('p, i, ii')->leftJoin('p.items', 'i')->leftJoin('i.image', 'ii');
$fetchResult = false;
$qbArticles = $this->_em->getRepository('Newscoop\\Package\\ArticlePackage')->createQueryBuilder('ap')->select('ap', 'a')->leftJoin('ap.article', 'a');
if ($criteria->publication) {
$qbArticles->where('a.publication = :publication')->setParameter('publication', $criteria->publication);
$fetchResult = true;
}
if ($criteria->articleNumber && $criteria->articleLanguage) {
$qbArticles->where('ap.article = :article')->andWhere('a.language = :language')->setParameters(array('article' => $criteria->articleNumber, 'language' => $criteria->articleLanguage));
$fetchResult = true;
}
if ($fetchResult) {
$articlePackages = $qbArticles->getQuery()->getArrayResult();
$packagesIds = array();
foreach ($articlePackages as $package) {
$packagesIds[] = $package['package_id'];
}
$qb->andWhere('p.id IN (:packagesIds)')->setParameter('packagesIds', $packagesIds);
}
foreach ($criteria->perametersOperators as $key => $operator) {
if ($criteria->{$key} !== null) {
$qb->andWhere('p.' . $key . ' ' . $operator . ' :' . $key)->setParameter($key, $criteria->{$key});
}
}
$metadata = $this->getClassMetadata();
foreach ($criteria->orderBy as $key => $order) {
if (array_key_exists($key, $metadata->columnNames)) {
$key = 'p.' . $key;
}
$qb->orderBy($key, $order);
}
$query = $qb->getQuery();
return $query;
}