原则:从ID

时间:2015-04-26 15:58:09

标签: php symfony doctrine-orm lifecycle

我有一个名为" refNo"在名为" Job"的对象中,此数字是通过将状态缩写 id + 2023 创建的。这意味着,如果这项工作在加利福尼亚州完成,且该对象的id为2,那么refNo必须是:CA-2025

我有这段代码:

 public function __construct()
    {
    $this->refNo = $this->state . '-'. ($this->id + 2023);
    }

这会使每个人都识别CA-2023,这意味着在创建id之前不会生成id。我尝试过以这种方式使用这些@HasLifecycleCallbacks: prePersist , postPersist , preFlush , onFlush

/**
 * @PostPersist 
 */
public function jobNo()
{
  $this->jobNo =  $this->id + 2286;
}

没有运气。无论如何我怎么能做到这一点?感谢

2 个答案:

答案 0 :(得分:1)

问题是您在数据库中创建了一个实体并获得了ID。然后调用@PostPersist方法并设置jobNo。但是,您不会再flush,因此即使您设置了jobNo ,也不会将其实际保存在数据库中。

解决方案是在之后再次将其重新保存在数据库中。

答案 1 :(得分:0)

我使用单独的事件侦听器为各种实体生成代码。这是在创建实体后唤起$entity->generateRef();的简化示例。

<?php

namespace Example\CommonBundle\EventListener;

use Doctrine\ORM\Event\LifecycleEventArgs;

class CodeAssembler
{
    public function postPersist(LifecycleEventArgs $args)
    {
        $classes = array(
            'Example\CommonBundle\Entity\Job',
        );

        $entity = $args->getEntity();

        if (in_array(get_class($entity), $classes)) {
            $entity->generateRef();
            $args->getEntityManager()->flush();    
        }
    }
}

附加事件监听器:

# services.yml
example_common.code_assembler_listener:
        class: Example\CommonBundle\EventListener\CodeAssembler
        tags:
            - { name: doctrine.event_listener, event: postPersist }