2012-03-06 45 views
1

学说2支持多种方法来创建一个查询。Doctrine2:何时使用查询生成器,它是从构建查询的其他方式的区别?

其中之一是经典的方式,通过实体管理器;

$this->getEntityManager() 
     ->createQuery('SELECT p FROM AcmeStoreBundle:Product p ORDER BY p.name ASC') 
     ->getResult(); 

而另一种是与查询生成器:

$qb = $this->createQueryBuilder('c'); 
    //... 
     ->leftJoin('c.city_state', 's') 
     ->where("CONCAT(c.name) LIKE :$field") 
     ->setParameter("$field", "%$smartbox%", \PDO::PARAM_STR) 
     ->setMaxResults($limit); 

乍一看,我会用后者的唯一原因是为了帮助我建立的条件查询。

if($value == 'something') 
    $qb->add('where', '...'); 

我徘徊是否有其他的原因,我宁愿第一或写一个通常的查询第二种方式?

而且,还有其他方法可以在Doctrine 2中构建查询(本机查询除外)?

编辑:我刚刚发现了类似的问题here,但没有答案被接受。

回答

4

所有查询生成器是创建DQL所以两者之间没有功能上的差异。我总是使用查询生成器来避免生成长字符串,因为我发现代码更易于阅读。但这确实是一个味道问题。

如果你有一个仓库,那么查询生成器就不需要说明根类名(即AcmeStoreBundle:Product)。当然,要获取存储库,您可能必须知道名称。

相关问题