Doctrine Query Language(DQL)-Symfony5全面开发
在上节课我们说QueryBuilder创建的查询,最后都将转换为DQL语句进行查询,如果你对SQL语句非常熟悉,并且也对性能有一定的要求,你可以直接写DQL语句来进行查询。
我们在PostRepository类中添加一个DQL查询方法,这次我们使用DQL语句来对文章的标题进行模糊查询,PostRepository类的父类为我们提供了一个EntityManager对象。我们按着command键点击createtQueryBuilder()这个方法,_em
就是PostRepository的父类,为我们提供的一个EntityManager对象,我们可以直接使用这个对象,来创建DQL查询,$this->_em->createQuery()
参数就是DQL语句。
我们需要查询文章数据,SELECT p FROM App\Entity\Post
,别名设置为p,查询条件WHERE p.title LIKE,关键字我们都用大写来写,下面是占位符参数,我们想对结果进行排序,输入ORDER BY p.id
,这次我们使用降序DESC对结果进行排列。然后我们使用setParameter(),对占位符参数keyword,进行设置,它的值就是我们的参数$keywords。然后我们设置最大的结果数量为10。最后getResult()获取结果,将结果进行返回。
class PostRepository extends ServiceEntityRepository
{
public function findByTitleDQL(string $keywords)
{
return $this->_em->createQuery('SELECT p FROM App\Entity\Post p WHERE p.title LIKE :keywords ORDER BY p.id DESC')
->setParameter('keywords', '%' . $keywords . '%')
->setMaxResults(10)
->getResult();
}
}
回到测试代码,在第106行后面我们添加测试代码,关键字这次我们输入03,我们断言结果只有一条,并且结果的标题为Post title 03,执行测试代码,测试出错了,回看我们编写的查询方,参数这里我们没有使用百分号。我们添加百分号,再次执行测试代码,这次测试通过了。
如果你对SQL语法比较熟悉,推荐你使用DQL语句进行查询,这样可以更灵活一些,效率也更高一些。
如果你想学习更多的查询,请您查看doctrine的官方文档。
在项目开发的过程中,我们希望能够有一些临时数据来供我们使用,Symfony也提供了这样的组件。在下节课,我们将安装组件并且使用临时数据。