学说:从 ID 生成参考号

Doctrine : Generate Reference number from ID

我在一个名为“Job”的对象中有一个名为“refNo”的字段,这个数字是通过将 state initialsid + 2023。意思是,如果这个工作是在加利福尼亚完成的,并且这个对象的 id 是 2,那么 refNo 必须是:CA-2025.

我有这个代码:

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

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

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

运气不好。无论如何我怎么能做到这一点?谢谢

问题是您在数据库中创建了一个实体并为其分配了 ID。然后你的 @PostPersist 方法被调用并设置 jobNo。但是,您不会在它之后再次 flush,所以即使您的 jobNo 已设置 ,您也不会真正将其保存在数据库中。

解决方法是之后重新存入数据库

我正在使用单独的事件侦听器为各种实体生成代码。这是创建实体后调用 $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 }