symfony3 doctrine2 关联计数器字段

symfony3 doctrine2 association counter field

考虑以下情况:我有两个实体:ArticleArticleComment

// \AppBundle\Entity\Article

/**
 * @ORM\OneToMany(targetEntity="ArticleComment", mappedBy="article")
 */
private $comments;

我需要在文章的一个字段中存储评论数量(例如 articles.comments_count)。每当创建或删除评论时,都需要更新该字段。

以前我使用的是 CakePHP 框架,它内置了 CounterCache behavior,它会自动执行此操作。我已尽力为 Doctrine 2 找到类似的东西(从 DoctrineExtensions 库开始),但似乎没有什么能满足我的要求。

任何图书馆都这样做吗?还是我必须想出自己的解决方案?

编辑:我试过使用 Entity Events,但我需要在许多实体上使用这种行为,所以我对可重用的解决方案感兴趣

你可以看看额外的懒人协会。 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/extra-lazy-associations.html

这样您就不需要存储 comment_counter 因为您可以在您的集合上使用 count() 函数而无需加载整个集合。 在内部,Doctrine 将发出一个 "select count" 查询。

这是另一个答案,它避免了存储这种聚合,并使您能够按照评论中的要求使用分页器。我还没有测试它,所以可能会有一些错误。

$qb = $em->createQueryBuilder();
$qb
  ->select('a.title, a.author, count(c)')
  ->from('Article', 'a')
  ->leftJoin('a.comments', 'c')
  ->groupBy('a.id');

$paginator = $this->get('knp_paginator'); 
$pagination = $paginator->paginate($qb, $page, $limit);

正如我所说,这个问题与 Doctrine 无关,因为您的初始模型设计很糟糕。 通常,您不需要存储可以使用 count/groupby 查询计算的聚合。 当您有很多连接的实体会在计算过程中产生实际开销时,这种聚合很有用。否则,你不需要它。