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的使用你可以继续看,或者你可以使用编辑器去看他的不同方法。但是我建议你继续看。