diff --git a/src/App/templates/partial/left-menu.html.twig b/src/App/templates/partial/left-menu.html.twig index 740d9b2b..1fc59b96 100644 --- a/src/App/templates/partial/left-menu.html.twig +++ b/src/App/templates/partial/left-menu.html.twig @@ -29,7 +29,7 @@
  • {{ category.name }} - {{ category.posts.count() }} + {{ category.publishedPostsCount }}
  • {% endfor %} diff --git a/src/Blog/src/Entity/Category.php b/src/Blog/src/Entity/Category.php index ce812c30..62233a0a 100644 --- a/src/Blog/src/Entity/Category.php +++ b/src/Blog/src/Entity/Category.php @@ -6,8 +6,11 @@ use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; +use Doctrine\Common\Collections\Criteria; +use Doctrine\Common\Collections\Selectable; use Doctrine\ORM\Mapping as ORM; use Light\App\Entity\AbstractEntity; +use Light\Blog\Enum\PostStatusEnum; use Light\Blog\Repository\CategoryRepository; #[ORM\Entity(repositoryClass: CategoryRepository::class)] @@ -24,7 +27,7 @@ class Category extends AbstractEntity #[ORM\Column(name: 'isVisible', type: 'boolean')] private bool $isVisible = true; - /** @var Collection */ + /** @var Collection&Selectable */ #[ORM\OneToMany(mappedBy: 'category', targetEntity: Post::class)] private Collection $posts; @@ -73,6 +76,13 @@ public function getPosts(): Collection return $this->posts; } + public function getPublishedPostsCount(): int + { + $criteria = Criteria::create()->where(Criteria::expr()->eq('status', PostStatusEnum::Published)); + + return $this->posts->matching($criteria)->count(); + } + /** * @return array{ * id: non-empty-string, diff --git a/test/Unit/Blog/Entity/CategoryTest.php b/test/Unit/Blog/Entity/CategoryTest.php new file mode 100644 index 00000000..bea5035a --- /dev/null +++ b/test/Unit/Blog/Entity/CategoryTest.php @@ -0,0 +1,33 @@ +setStatus(PostStatusEnum::Published); + + $draft = new Post(); + $draft->setStatus(PostStatusEnum::Draft); + + $private = new Post(); + $private->setStatus(PostStatusEnum::Private); + + $category->getPosts()->add($published); + $category->getPosts()->add($draft); + $category->getPosts()->add($private); + + self::assertSame(1, $category->getPublishedPostsCount()); + } +}