Как использовать подстановочные знаки в createQueryBuilder? - PullRequest
3 голосов
/ 28 ноября 2011

В моем классе репозитория я использую:

public function getItemsByTag($tag)
{
    $qb = $this->createQueryBuilder('c')
               ->select('c')
               ->where('c.tags LIKE %bipolar%')
               ->addOrderBy('c.id');

    return $qb->getQuery()
              ->getResult();
}

Но, к сожалению, это не работает .. Кто-нибудь знает, как это может работать?Или мне нужно создать собственный запрос без QueryBuilder?

Спасибо!

Ответы [ 3 ]

13 голосов
/ 28 ноября 2011

Поиск на основе одного параметра:

Я думаю, что это должно идти:

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();
3 голосов
/ 12 июня 2012

Если вы не хотите заменять свой запрос переменными, а используете статическую строку, вы должны поместить строку в апострофы.

У вас есть , чтобы использовать апострофы вместо кавычек!В противном случае лексер Doctrine2 выдаст исключение.

Так что в вашем случае Майк вы можете использовать:

'c.tags LIKE \'%bipolar%\''

или

"c.tags like '%bipolar%'"
1 голос
/ 28 ноября 2011

Я мало что знаю о Symfony, но, исходя из того, что я знаю о PHP и MySQL, я думаю, вы имеете в виду 'c.tags LIKE "%bipolar%"'. Скорее всего, вам нужны кавычки около %bipolar%.

...