ict/qb_criteria

轻松添加标准到您的 doctrine orm 查询

dev-master 2023-05-13 15:06 UTC

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"
]