Symfony2和Doctrine - 在插入时生成代码

时间:2012-11-03 16:17:19

标签: php database symfony callback doctrine

使用Symfon2.0和Doctrine,我尝试执行以下操作:

  1. 在数据库中插入新行
  2. 在插入时,自动生成代码并插入。
  3. 该代码与表的ID有关。像<something>/row_id
  4. 之类的东西

    我怎样才能轻松做到这一点?

    我一直在尝试Doctrine Livecycle回调。但是:

    • PrePersist仍然没有身份证明。
    • PostPersist有ID,但不知何故插入已经完成,虽然我可以从实体设置任何属性,但我不知道如何让它再次“保持”到数据库。

    有任何线索吗?

    还有其他方法吗?

1 个答案:

答案 0 :(得分:1)

在您的创建控制器中:

if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($entity);
        $em->flush();

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

        return $this->redirect($this->generateUrl('entity_show'
           ,array('id' => $entity->getId())));
    }

您需要添加第二个块($ entity-&gt; setCode ...),并且需要根据您的目的进行自定义

或者,您可以使用听众:

<?php

namespace ormed\ormedBundle\Listener;

use Doctrine\ORM\Event\OnFlushEventArgs; use
Symfony\Component\DependencyInjection\Container;

class LastModifiedListener {

  private $container;

  public function __construct(Container $container){$this->container = $container;}

  public function onFlush(OnFlushEventArgs $eventArgs)
  {
      $entityManager = $eventArgs->getEntityManager();
      $unitOfWork = $entityManager->getUnitOfWork();

      foreach ($unitOfWork->getScheduledEntityInsertions() AS $entity) {
          $entity->setCode( $code );

          $entityManager->persist($entity);
          $classMetadata = $entityManager->getClassMetadata(get_class($entity));
          $unitOfWork->recomputeSingleEntityChangeSet($classMetadata, $entity);
} } }