Published on

doctrine教程2---DQL

原创文章,转载时需取得本人同意并注明来源
Authors
  • doctrine教程2---DQL
    Name
    langziyang
    Twitter

你可以看到我们在控制器的方法上自动装配了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';