kikwik / doctrine-relation-count-bundle

将计数器作为数据库属性管理 doctrine 关系

v1.0.2 2024-06-08 19:51 UTC

This package is auto-updated.

Last update: 2024-09-08 20:20:40 UTC


README

将计数器作为数据库属性管理 doctrine 关系

安装

  1. 需要这个包
#!/bin/bash
composer require kikwik/doctrine-relation-count-bundle

使用

  • 在相关类中添加一个整数字段,该字段将包含计数值,不需要设置器。
#[ORM\Entity(repositoryClass: FamigliaRepository::class)]
class Famiglia
{
    #[ORM\Column]
    private int $numProdotti = 0;

    public function getNumProdotti(): int
    {
        return $this->numProdotti;
    }
}
#[ORM\Entity(repositoryClass: SimboloRepository::class)]
class Simbolo
{
    #[ORM\Column]
    private int $numProdotti = 0;

    public function getNumProdotti(): int
    {
        return $this->numProdotti;
    }
}
  • 在子类顶部添加 #[CountableEntity] 属性
  • 在要计数的 ManyToOne 或 ManyToMany 关系上添加 #[CountableRelation] 属性
  • targetProperty 参数设置为相关类中的计数属性
use Kikwik\DoctrineRelationCountBundle\Attribute\CountableEntity;
use Kikwik\DoctrineRelationCountBundle\Attribute\CountableRelation;

#[ORM\Entity(repositoryClass: ProdottoRepository::class)]
#[CountableEntity]
class Prodotto 
{
    #[ORM\ManyToOne(inversedBy: 'prodotti')]
    #[CountableRelation(targetProperty: 'numProdotti')]
    private ?Famiglia $famiglia = null;

    #[ORM\ManyToMany(targetEntity: Simbolo::class, inversedBy: 'prodotti')]
    #[CountableRelation(targetProperty: 'numProdotti')]
    private Collection $simboli;
}

自定义更新器

如果您需要使用自定义查询来更新计数器,您可以在子仓库中定义一个 updateCountableRelation 方法

class ProdottoRepository extends ServiceEntityRepository
{
    public function updateCountableRelation(object $localObject, string $relationName, object $relatedObject, string $relatedProperty)
    {
        $dql = sprintf('UPDATE %s related set related.%s = (SELECT COUNT(local.id) FROM %s local WHERE local.%s = :id AND local.isActive = 1) WHERE related.id = :id',
                        get_class($relatedObject),
                        $relatedProperty,
                        get_class($localObject),
                        $relationName,
                    );

        $query = $this->getEntityManager()->createQuery($dql)
            ->setParameter('id', $relatedObject->getId());
        $query->execute();
    }
}