ict / qb_criteria
轻松添加标准到您的 doctrine orm 查询
dev-master
2023-05-13 15:06 UTC
Requires
- php: ^8.1
- doctrine/dbal: ^3.2
- doctrine/orm: ^2.11.0
- symfony/serializer: ^6.2
This package is auto-updated.
Last update: 2024-09-13 18:16:09 UTC
README
安装
使用 composer 安装此组件
composer require ict/qb_criteria:dev-master
如何使用它
想象您有以下类
class ListContractsInput { #[Assert\DateTime(message: 'Start at must be a valid datetime')] private ?string $startAt = null; #[Assert\DateTime(message: 'End at must be a valid datetime')] private ?string $endAt = null; public function getStartAt(): ?string { return $this->startAt; } public function setStartAt(?string $startAt): void { $this->startAt = $startAt; } public function getEndAt(): ?string { return $this->endAt; } public function setEndAt(?string $endAt): void { $this->endAt = $endAt; } }
并且您希望将其数据用作查询中字段 createdAt 的过滤器。首先,您必须创建一个继承自 Ict\QbCriteria\QueryBuilderCriteriaManager 的类,并为每个要过滤的值创建一个方法。
class ContractsCriteriaManager extends QueryBuilderCriteriaManager { /** * @throws \Exception */ public function getStartAtCriteria(QueryBuilder $qb, string $alias, string|\DateTimeImmutable $value): void { $qb ->andWhere($qb->expr()->gte("{$alias}.createdAt",':start_at')) ->setParameter('start_at', $this->getAsDateTime($value)) ; } /** * @throws \Exception */ public function getEndAtCriteria(QueryBuilder $qb, string $alias, string|\DateTimeImmutable $value): void { $qb ->andWhere($qb->expr()->lte("{$alias}.createdAt",':end_at')) ->setParameter('end_at', $this->getAsDateTime($value)) ; } }
最后一个类包含两个方法
- getStartAtCriteria:它添加一个过滤器,确保 createdAt 大于 startAt 值
- getEndAtCriteria:它添加一个过滤器,确保 createdAt 小于 endAt 值
方法名称必须格式化为 get{KeyName}Criteria。否则,基类将无法找到它们。
在仓库方法中使用
public function getList(array|object $criteria, ?User $user, ?int $limit): array { $criteriaManager = new ContractsCriteriaManager(); $qb = $this->createQueryBuilder(self::ALIAS); if($limit){ $qb->setMaxResults($limit); } $qb->orderBy(self::ALIAS . '.createdAt', 'desc'); $criteriaManager->addCriteria($qb, self::ALIAS, $criteria); return $qb->getQuery()->getResult(); }
如您在方法末尾所见,您传递查询构建器、别名和标准,它将填充正确的过滤器。
您可以使用数组而不是对象:例如,根据上述模型,您将传递一个如下的数组
[ "startAt" : "2023-05-03 16:45:00", "end_at" : "2023-05-11 16:45:00" ]