学说2中的自动计数

时间:2015-12-13 22:04:44

标签: php symfony doctrine-orm count doctrine

使用Doctrine 2和Symfony 2.7我想对数据库中的列使用自动计数。

例:
因此,当我更新报告时,我想将用户(通过OneToMany关系进行报告的父级)添加到排行榜,其中 已完成 设置为 1 (setCompleted)。当用户已经在排行榜上时,我想找到他并添加1 到已完成的任务值。

    if (!$lb) {
       $new = New Leaderboard();
       $new->setUsers($user)
           ->setCompleted('1');
       $em->persist($new);
   } else {
       $update = $em->getRepository('AppBundle:Leaderboard')->findBy(array('user' => $user));
       $update->setCompleted('2');
   }

所以基本上我想自动化$update->setCompleted('2');,以便它获取当前值并向其中添加一个,然后将其刷新到数据库。

我希望这有道理吗?不确定如何解释或在线搜索...

1 个答案:

答案 0 :(得分:0)

您可以使用onFlush侦听器来监视报表实体的更新,并根据报表的状态增加/创建排行榜条目。

http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/events.html#onflush

需要一些(小心)阅读,但它会做你想要的。

这里有几个问题我或多或少地回答了相同的主题,其中的示例可以让您快速入门

Track field changes on Doctrine entity

Persisting other entities inside preUpdate of Doctrine Entity Listener

您想要的基本流程是捕获Report的更新(在我的答案下,更简单的第二个示例显示了为实体完成此操作)。然后根据Report的状态,创建一个新的Leaderboard实体并将其附加到Report,或者更新该报告的现有Leaderboard实体。

请注意,不要刷新实体很重要,只需将其添加到UOW就像这样

    $this->getEntityManager()->persist($entity);
    $metaData = $this->getEntityManager()->getClassMetadata($className);
    $this->getUnitOfWork()->computeChangeSet($metaData, $entity);

希望有所帮助!