demos-europe / edt-dql
扩展 demos-europe/edt-queries,以 Doctrine ORM 作为数据源。
Requires
- php: ^8.1
- demos-europe/edt-paths: ^0.26
- demos-europe/edt-queries: ^0.26
- doctrine/orm: ^2.5
- nette/php-generator: ^4.0
- symfony/cache: ^5 || ^6 || ^7
Conflicts
- demos-europe/edt-access-definitions: <0.17.1
- demos-europe/edt-extra: <0.17.1
- demos-europe/edt-jsonapi: <0.17.1
- demos-europe/edt-paths: <0.17.1
- dev-main
- 0.26.0
- 0.25.0
- 0.24.42
- 0.24.41
- 0.24.40
- 0.24.39
- 0.24.38
- 0.24.37
- 0.24.36
- 0.24.35
- 0.24.34
- 0.24.32
- 0.24.31
- 0.24.30
- 0.24.29
- 0.24.28
- 0.24.27
- 0.24.26
- 0.24.25
- 0.24.24
- 0.24.23
- 0.24.22
- 0.24.21
- 0.24.20
- 0.24.19
- 0.24.18
- 0.24.17
- 0.24.16
- 0.24.15
- 0.24.14
- 0.24.13
- 0.24.12
- 0.24.11
- 0.24.10
- 0.24.9
- 0.24.8
- 0.24.7
- 0.24.6
- 0.24.5
- 0.24.4
- 0.24.3
- 0.24.2
- 0.24.1
- 0.24.0
- 0.23.6
- 0.23.5
- 0.23.4
- 0.23.3
- 0.23.2
- 0.23.1
- 0.23.0
- 0.22.3
- 0.22.2
- 0.22.1
- 0.22.0
- 0.21.4
- 0.21.3
- 0.21.2
- 0.21.1
- 0.21.0
- 0.20.1
- 0.18.0
- 0.17.5
- 0.16.1
- 0.16.0
- 0.15.1
- 0.15.0
- 0.14.1
- 0.14.0
- 0.13.2
- 0.13.1
- 0.13.0
- 0.12.23
- 0.12.22
- 0.12.21
- 0.12.20
- 0.12.19
- 0.12.18
- 0.12.17
- 0.12.16
- 0.12.15
- 0.12.14
- 0.12.13
- 0.12.12
- 0.12.11
- 0.12.10
- 0.12.9
- 0.12.8
- 0.12.7
- 0.12.6
- 0.12.5
- 0.12.4
- 0.12.3
- 0.12.2
- 0.12.1
- 0.12.0
- 0.11.2
- 0.11.1
- 0.11.0
- 0.10.0
- 0.9.0
- 0.8.0
- 0.7.1
- 0.7.0
- 0.6.4
- 0.6.3
- 0.6.2
- 0.6.1
This package is auto-updated.
Last update: 2024-09-20 20:16:13 UTC
README
通过支持 Doctrine ORM 扩展 edt/queries
。
同时作为 Doctrine ORM 的辅助库,用于生成 DQL 查询。目前,重点在于从给定的属性路径检测连接子句,以排序和过滤结果集。
假设用户对 Doctrine ORM 有基本了解才能使用此库。
示例
假设我们有一个 Book
、Person
和 Address
实体。
Book
有一个 author
属性,它引用了 Person
实体。
Person
有一个 birth
属性,其中包含有关出生地和日期的信息。
Birth
实体有一个 country
属性,它是一个字符串。
目标是获取所有作者出生在美国的 Book
实体。这可以通过首先从数据库中获取所有实体并在 PHP 中过滤结果来实现。但从性能和内存的角度来看,在数据库中执行过滤更合理。
使用 DQL,我们可以创建一个查询,包含两个连接来获取所需的结果
use \Tests\data\DqlModel\Book; $queryBuilder = $this->getEntityManager()->createQueryBuilder() ->select('Book') ->from(Book::class, 'Book') ->leftJoin('Book.author', 'Person') ->leftJoin('Person.birth', 'Birth') ->where('Birth.country = :countryName') ->setParameter('countryName', 'USA');
此库可以从以下代码生成类似的查询构建器
use \Tests\data\DqlModel\Book; use EDT\DqlQuerying\ConditionFactories\DqlConditionFactory; use \EDT\DqlQuerying\Utilities\QueryBuilderPreparer; /** @var \Doctrine\ORM\EntityManager $entityManager */ $entityManager = $this->getEntityManager(); $conditionFactory = new DqlConditionFactory(); $metadataFactory = $entityManager->getMetadataFactory(); $builderPreparer = new QueryBuilderPreparer(Book::class, $metadataFactory, new JoinFinder($metadataFactory)); $builderPreparer->setWhereExpressions([ $conditionFactory->propertyHasValue('USA', 'authors', 'birth', 'country'), ]); $builderPreparer->fillQueryBuilder($entityManager->createQueryBuilder());
第二个版本的主要优势不在于行数或可读性,而在于无需手动详细指定查询。这允许动态接收查询并直接在数据库中执行(前提是在之前检查了授权和验证)。
条件
除了上面显示的 PropertyHasValue
之外,还支持更多条件类型。所有由库提供的条件都可以通过使用 DqlConditionFactory
类找到和创建。
如果提供的条件不足以满足需要,您可以编写自己的子句,通过实现 ClauseInterface
。
条件嵌套
可以使用 AND
或 OR
连接词将条件组合在一起
$conditionFactory = new EDT\DqlQuerying\ConditionFactories\DqlConditionFactory(); $andConditions = [ /* ... */]; $orConditions = [ /* ... */]; $orCondition = $conditionFactory->anyConditionApplies(...$orConditions); $nestedCondition = $conditionFactory->allConditionsApply(...$andConditions);
排序
定义排序的方法与定义条件的方法类似。在以下示例中,书籍将按作者姓名作为第一优先级进行排序,作者出生日期作为第二优先级。
use EDT\DqlQuerying\ConditionFactories\DqlConditionFactory; use EDT\DqlQuerying\SortMethodFactories\SortMethodFactory; use \Tests\data\DqlModel\Book; use EDT\DqlQuerying\Utilities\QueryBuilderPreparer; /** @var \Doctrine\ORM\EntityManager $entityManager */ $entityManager = $this->getEntityManager(); $conditionFactory = new DqlConditionFactory(); $sortingFactory = new SortMethodFactory(); $metadataFactory = $entityManager->getMetadataFactory(); $builderPreparer = new QueryBuilderPreparer(Book::class, $metadataFactory, new JoinFinder($metadataFactory)); $builderPreparer->setSelectExpressions([ $sortingFactory->propertyAscending('authors', 'name'), $sortingFactory->propertyDescending('authors', 'birthdate'), ]); $builderPreparer->fillQueryBuilder($entityManager->createQueryBuilder());
如果提供的排序实现不足以满足需要,您可以编写自己的排序实现。
致谢和认可
由 Christian Dressler 担任概念和实现,感谢 eFrane。