Поиск на основе одного параметра:
Я думаю, что это должно идти:
public function getItemsByTag($tag)
{
$qb = $this->createQueryBuilder('c')
->select('c')
->where('c.tags LIKE :tag')
->addOrderBy('c.id')
->setParameter('tag', $tag);
return $qb->getQuery()->getResult();
}
Но я думаю, что не рекомендуется делать LIKE как частьгде используется построитель запросов, поэтому вы должны сделать:
$qb = $this->createQueryBuilder('c');
$qb->select('c')
->where($qb->expr()->like('c.tags', '?1'))
->addOrderBy('c.id')
->setParameter(1, $tag);
return $qb->getQuery()->getResult();
Ознакомьтесь с документацией для получения дополнительной информации, в разделе, озаглавленном Вспомогательные методы *, есть пример выражения типа like1013 *
Я также должен отметить, что в каждом примере я использовал разные соглашения для передачи параметра в запрос, первый использовал именованный параметр :tag
, который устанавливается setParameter('tag', $value)
, второй - просто пронумерованный параметр?1
, вы могли бы так же легко использовать именованный параметр во втором примере, если бы захотели.
Поиск по массиву параметров:
Вы также спрашивали о множестве лайков.Здесь это с выражением OR, но если вы хотите найти все теги, вы можете изменить его на AND.
Для того, чтобы создать «LIKE массив», вам просто нужно создать выражение самостоятельно.
$qb = $this->createQueryBuilder('c');
$orExpr = $qb->expr()->orX();
for ($i = 0; $i < count($tags); $i++) {
$orExpr->add($qb->expr->like('c.tags', "?$i"));
// You may have to set params later in a loop after $orExpr has been
// added to the queryBuilder.
$qb->setParameter($i, $tags[$i]);
}
$qb->select('c')->where($orExpr)->addOrderBy('c.id');
return $qb->getQuery()->getResult();