Doctrine2:何时使用查询构建器,它与构建查询的其他方式有何不同?

时间:2012-03-06 13:22:01

标签: doctrine-orm

Doctrine 2支持许多创建查询的方法。

其中一个是通过实体经理的经典方式;

    $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中构建查询(Native查询除外)?

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

1 个答案:

答案 0 :(得分:4)

所有查询构建器都是创建dql,因此两者之间没有功能差异。我总是使用查询构建器来避免编写长字符串,因为我发现代码更容易阅读。但这真的是品味问题。

如果您有一个存储库,那么查询构建器就不需要拼写根类名称(即AcmeStoreBundle:Product)。当然,要获得存储库,您可能必须知道该名称。