- Published on
doctrine教程2---DQL
原创文章,转载时需取得本人同意并注明来源
- Authors
-
-
- Name
- langziyang
-
你可以看到我们在控制器的方法上自动装配了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';