Доктрина: преобразование запроса createQuery в createQueryBuilder - PullRequest
2 голосов
/ 13 декабря 2011

Это текущий запрос, который у меня есть, и он отлично работает:

$q = $this->_em->createQuery("SELECT s FROM app\models\Sub s 
                              LEFT JOIN s.case c
                              WHERE s.type LIKE '%$type'
                              AND c.id = '$id'");


foreach ($q->getResult() as $row) {
   $results[$row->getId()] = $row;
}

Я хочу преобразовать это в структуру API QueryBuilder, это то, что у меня есть, но она работает неправильно. (И мне нужны результаты в том же формате, что и выше).

 $q = $this->_em->createQueryBuilder();

 $q->add('select', 's')
   ->add('from', 'app\models\Sub s')
   ->add('leftJoin', 's.case c')
   ->add('where', 's.type LIKE :type')
   ->add('where', 'c.id = :case');
   ->setParameter('type', "%$type");
   ->setParameter('case', $id);

И снова, это не работает должным образом, и я не знаю, как получить результаты в том же формате, что и выше. Спасибо!

1 Ответ

1 голос
/ 13 декабря 2011

Близко, но без сигары.Вам нужно научиться использовать классы Expr, входящие в состав Doctrine, для создания правильного предложения WHERE.

http://www.doctrine -project.org / docs / orm / 2.1 / en /reference / query-builder.html # expr-classes

В приведенном вами примере вы фактически стремитесь к чему-то вроде этого (не проверено):

$q->add('select', 's')
  ->add('from', 'app\model\Sub s')
  ->add('leftJoin', 's.case c')
  ->add('where', $q->expr()->andX($q->expr()->like('s.type', ':type'), $q->expr()->eq('case', ':case')))
  ->setParameter('type', "%$type")
  ->setParameter('case', $id);

Как вашПредложение WHERE усложняется, как и вложенность выражений.

...