学说实体增加值(下载计数器)

时间:2014-07-10 16:19:15

标签: php symfony doctrine-orm doctrine

我想在我的学说实体中增加一个值 目前我正是这样做的。

$file->setDownloadCounter($file->getDownloadCounter() + 1);
$em = $this->getDoctrine()->getManager();
$em->persist($fileVersion);
$em->flush();

有没有办法在学说中执行类似的东西:

UPDATE file SET downloadCounter = downloadCounter + 1 WHERE id = 1

修改

上面的学说示例中的问题是加载和刷新之间是其他人可以下载文件的时间,因此计数器不正确。

4 个答案:

答案 0 :(得分:6)

您还可以在实体存储库中执行以下操作:

return $this
    ->createQueryBuilder('f')
    ->update($this->getEntityName(), 'f')
    ->set('f.downloadCounter', $file->getDownloadCounter() + 1)
    ->where('f.id = :id')->setParameter('id', $file->getId())
    ->getQuery()
    ->execute();

或使用DQL:

 $em = $this->getDoctrine()->getManager();
 $query = $em->createQuery(
     'UPDATE YourBundle:File f
      SET f.downloadCounter = :downloadCounter'
 )->setParameter('downloadCounter', $file->getDownloadCounter() + 1);

或通过简化的DQL:

 $em = $this->getDoctrine()->getManager();
 $query = $em->createQuery(
     'UPDATE YourBundle:File f
      SET f.downloadCounter = f.downloadCounter + 1'
 );

这些解决方案的缺点:如果您的实体已经加载,它将具有先前的计数而不是递增的计数。

你做的方式非常好,但更好的方法是向你的实体添加一个增量方法。

答案 1 :(得分:2)

最安全的方法是使用Doctrine DBAL并调用原始SQL,这样可以消除争用情况的机会并使更改成为原子。另一种选择是使字段版本化并使用optimistic locking或悲观的DB级锁定。

答案 2 :(得分:-1)

您只需向模型添加增量方法即可。

class File {
    public function increaseDownloadCounter()
    {
        $this->downloadCounter++;
    }
}

答案 3 :(得分:-2)

$em = $this->getDoctrine()->getManager();

$entity = $em->getRepository('AcmeDemoBundle:EntityName')->find($entityId);
$valueToIncrement = $entity->getMyField(); // where MyField is the DB field to increment
$entity->setMyField(++$valueToIncrement);

$em->persist($entity);
$em->flush();