doctrine教程2---DQL

Mario Sanchez

15 people read
Thumbnail

你可以看到我们在控制器的方法上自动装配了CategoryRepository并使用最简单的findAll()方法来查询 Doctrine 中的某些内容

我们的第一个技巧将非常简单,但很有趣。我想按名称的字母顺序对这些类别重新排序。一种简单的方法是将 findAll() 更改为 findBy() 。这通常用于查找符合条件的项目 - 例如 ['name' => 'foo'] 。 也可以将其留空并利用第二个参数:按数组排序。所以我们可以说类似 ['name' => 'DESC'] 。

当我需要自定义查询时,我喜欢创建自定义存储库方法来集中所有内容。转到 src/Repository/ 目录并打开 CategoryRepository.php 。在里面,我们可以添加任何我们想要的方法。让我们创建一个名为 public function findAllOrdered() 的新元素。这将返回一个 array。 然后返回控制器,把findAll()修改为findAllOrdered();

此时我们还没有任何数据返回,所以刷新页面会出错。

本节我们先从DQL开始,Doctrine可以与很多数据库配合,比如mysql,postgresql,mssql等。每一种都有不同的方法,所以Doctrine 必须发明自己的类似 SQL 的语言,称为“DQL”,与sql最大的区别可能是我们引用类和属性而不是表和列

接下来我们在findAllOrdered()方法里写下第一个dql

public function findAllOrdered(): array
    {
        $dql = 'SELECT category FROM App\Entity\Category as category';
        $query = $this->getEntityManager()->createQuery($dql);
        return $query->getResult();
    }

可以看到dql和sql写法很像,只是我们把表名换成了类,然后生成一个query并返回getResult()

那么添加ORDER BY也很跟sql差不多,只不过你需要把字段名修改为属性名,

    $dql = 'SELECT category FROM App\Entity\Category as category ORDER BY category.name DESC';

About Me

我是一位精通 Symfony 框架和 API Platform 的开发者,擅长构建高效、可扩展的 Web 应用程序和 API。 此外,我还具备 PrestaShop 模块开发经验,能够为您的电商平台定制功能,满足特定业务需求。