Symfony2/Doctrine QueryBuilder с помощью andwhere()
Я использую следующий метод в классе репозитория для поиска определенных тегов в моей базе данных:
public function getItemsByTag($tag, $limit = null)
{
$tag = '%'.$tag.'%';
$qb = $this->createQueryBuilder('c');
$qb->select('c')
->where($qb->expr()->like('c.tags', '?1'))
->setParameter(1, $tag)
->addOrderBy('c.clicks', 'DESC');
if (false === is_null($limit))
$qb->setMaxResults($limit);
return $qb->getQuery()->getResult();
}
Это работает просто хорошо.. Но: Как я могу добавить 2 дополнительные переменные (где: review = 1, enabled = 1)? Я попробовал andwhere(), но я не мог понять это.
Я также узнал, что что-то вроде этого:
public function getItems($limit = null)
{
$qb = $this->createQueryBuilder('b')
->select('b')
->add('where', 'b.reviewed = 1')
->add('where', 'b.enabled = 1')
->addOrderBy('b.name', 'ASC');
// ...
}
тоже не будет работать...
Любые подсказки?
Ответы
Ответ 1
Я бы написал это следующим образом:
$qb = $this
->createQueryBuilder('c')
->where('c.tags LIKE :tag')
->andWhere('c.reviewed = 1')
->andWhere('c.enabled = 1')
->setParameter('tag', "%{$tag}%")
->orderBy('c.clicks', 'DESC')
->addOrderBy('b.name', 'ASC');
if ($limit) {
$qb->setMaxResults($limit);
}
return $qb->getQuery()->getResult();
Вы также можете объединить эти условия where
:
->where('c.tags LIKE :tag AND c.reviewed = 1 AND c.enabled = 1')
Ответ 2
В руководстве предлагаемый способ выглядит следующим образом:
$qb->select(array('c'))
->where($qb->expr()->orx(
$qb->expr()->eq('c.reviewed', 1),
$qb->expr()->eq('c.enabled', 1),
$qb->expr()->like('c.tags', '?1')
))
->orderBy('c.clicks', 'DESC'));