preUpdate事件后无法闪烁

时间:2014-01-16 11:09:05

标签: symfony doctrine-orm

这就是我在preUpdate中所做的事情

 public function preUpdate(LifecycleEventArgs $args)
{
    $entity = $args->getEntity();

    if ($entity instanceof Order) {
        if ($args->hasChangedField('status') && $args->getNewValue('status') == 'stock') {
            $this->container->get('activity_logger')->writeLog($entity, 'purchase');
        }
    }

这是我有错误的地方

  

FatalErrorException:错误:最长执行时间为60秒   超出/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php第2498行

public function writeLog ($object, $comment)
    {

        $entity = new Stock();
        $entity->setCategory($object->getIsotope()->getCategory()->getId());
        $entity->setComment($comment);
        $entity->setDate(new \DateTime('now'));
        $entity->setUser($object->getUser()->getId());
        $entity->setChange(TRUE);


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

还有另一种方式存储新实体吗?

找不到非常好的解决方案(手动完成)保存并且不要触摸事件

$sql = "INSERT INTO table (field1, field2) VALUES ('foo', 'var')";
$stmt = $em->getConnection()->prepare($sql);
$stmt->bindValue('invoice', $invoiceId);
$result = $stmt->execute();

2 个答案:

答案 0 :(得分:0)

我认为你不能这样做,因为托管实体的输出包含递归字段。

查看https://github.com/schmittjoh/JMSSerializerBundle :)并记录序列化版本;)

答案 1 :(得分:0)

为此,我将新创建的实体存储在EventSuscriber中的私有数组中。然后在suscriber的onFlush部分,如果该数组长度大于0,我将使用foreach循环保持它们。然后,在foreach循环之外,我清除数组(这对于防止无限循环非常重要)并最终调用flush。