【问题标题】:Symfony2 and Doctrine - Generate code on insertionSymfony2 和 Doctrine - 在插入时生成代码
【发布时间】:2025-12-14 11:30:01
【问题描述】:

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

  1. 在数据库中插入新行
  2. 在插入的瞬间,自动生成代码,同时插入。
  3. 该代码与表的 ID 有关。类似<something>/row_id

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

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

  • PrePersist 仍然没有 ID。
  • PostPersist 有 ID,但不知何故插入已经完成,虽然我可以设置实体的任何属性,但我不知道如何使其“再次”持久保存到数据库中。

那边有什么线索吗?

还有其他方法可以正确地做到这一点吗?

【问题讨论】:

  • 问题是:如果你在 PostPersist 中做某事并再次坚持,你会得到另一个 PostPersist...infinitum。数据库触发器很丑,但它们可以工作。
  • 作为一种变通方法,他只能在实体属性仍然为空的情况下更新它的值。

标签: php database symfony callback doctrine


【解决方案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->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);
} } }

【讨论】: