Doctrine:将createQuery查询转换为createQueryBuilder

时间:2011-12-13 16:38:22

标签: php doctrine-orm dql query-builder

这是我当前的查询,它运行正常:

$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;
}

我想将它转换为QueryBuilder API结构,这是我到目前为止所做的,但它无法正常工作。 (我需要的结果与上面的格式相同)。

 $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 个答案:

答案 0 :(得分:1)

关闭,但没有雪茄。您需要学习如何使用Doctrine附带的Expr类来创建正确的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子句变得更复杂,表达式的嵌套也会变得更复杂。

相关问题