symfony3 doctrine2 关联计数器字段
symfony3 doctrine2 association counter field
考虑以下情况:我有两个实体:Article
和 ArticleComment
:
// \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 查询计算的聚合。
当您有很多连接的实体会在计算过程中产生实际开销时,这种聚合很有用。否则,你不需要它。
考虑以下情况:我有两个实体:Article
和 ArticleComment
:
// \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 查询计算的聚合。 当您有很多连接的实体会在计算过程中产生实际开销时,这种聚合很有用。否则,你不需要它。