Doctrine我们介绍了DQL,他很像SQL也最终把语句转换成了SQL。但,你可不写DQL。我们可以用QueryBuilder去替换DQL:他是一个对象,可以我们构建DQL字符串。QueryBuilder是我在Doctrine中最喜欢的一部分。
创建Query Builder
让我们注释掉$dql。去创建一个QueryBuilder,创建一个$qb变量并从repository里调用$this->createQueryBuilder()。传入cat作为参数 – 他是Category类的别名。
| 1 2 3 4 5 6 7 8 9 | //src/AppBundle/Entity/CategoryRepository.php class CategoryRepository extends EntityRepository {     public function findAllOrdered()     {         $qb = $this->createQueryBuilder('cat') ...      } } | 
构建查询
现在,让我们看一些精彩的!QueryBuilder有很多的方法例如:andWhere, leftJoin 和 addOrderBy。让我们用用它们:使用addOrderBy方法,并传入cat.name作为第一个参数,DESC作为第二个参数:
| 1 2 3 4 5 6 7 8 9 | //src/AppBundle/Entity/CategoryRepository.php class CategoryRepository extends EntityRepository {     public function findAllOrdered()     {         $qb = $this->createQueryBuilder('cat')             ->addOrderBy('cat.name', 'DESC');     } | 
这段和我们之前构建的DQL是一样的。因为我们的createQueryBuilder()函数在CategoryRepository内,所以我们的函数自动把Category实体配置进来,当然cat是他的别名。
从这里获取一个Query对象,要使用 $qb->getQuery():
| 1 2 3 4 5 6 7 8 9 10 11 | //src/AppBundle/Entity/CategoryRepository.php class CategoryRepository extends EntityRepository {     public function findAllOrdered()     {         $qb = $this->createQueryBuilder('cat')             ->addOrderBy('cat.name', 'ASC');         $query = $qb->getQuery();     } } | 
不错哈哈。
还记得我们之前是怎样输出查询语句的吗?我们也可以打印DQL。让我们来看看我们努力的工作转化的DQL。
| 1 2 3 4 5 6 7 8 9 10 | //src/AppBundle/Entity/CategoryRepository.php     public function findAllOrdered()     {         $qb = $this->createQueryBuilder('cat')             ->addOrderBy('cat.name', 'ASC');         $query = $qb->getQuery();         var_dump($query->getDQL());die;         return $query->execute();     } | 
刷新~ 看看是不是很亲切:
| 1 | SELECT cat FROM AppBundle\Entity\Category ORDER BY cat.name DESC | 
这与我们之前写的DQL是相同的。所以,Query Builder仅仅是一个帮助我们写DQL好的方法,并且我喜欢他是因为我写一个方法他会替我自动完成语句构建,并且可以帮助你很容易的组合查询,就像一个复杂的JOIN,他可以传入多个查询条件。这个我以后再告诉你。
移除之前的die,刷新:
| 1 2 3 4 5 6 7 8 9 | //src/AppBundle/Entity/CategoryRepository.php     public function findAllOrdered()     {         $qb = $this->createQueryBuilder('cat')             ->addOrderBy('cat.name', 'ASC');         $query = $qb->getQuery();         return $query->execute();     } | 
他看起来很不错。你想知道更多关于QueryBuilder的使用你可以继续看,或者你可以使用编辑器去看他的不同方法。但是我建议你继续看。
