kikwik / doctrine-relation-count-bundle
将计数器作为数据库属性管理 doctrine 关系
v1.0.2
2024-06-08 19:51 UTC
Requires
- php: >=8.1
- doctrine/doctrine-bundle: ^2.8
- doctrine/orm: ^2.14 || ^3.0
- symfony/framework-bundle: ^6.4|^7.0
- symfony/property-access: ^6.4|^7.0
This package is auto-updated.
Last update: 2024-09-08 20:20:40 UTC
README
将计数器作为数据库属性管理 doctrine 关系
安装
- 需要这个包
#!/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(); } }