2

Symfon2.0 と Doctrine を使用して、次のことを試みています。

  1. データベースに新しい行を挿入する
  2. 挿入の瞬間に、自動的にコードを生成して挿入します。
  3. そのコードは、テーブルの ID に関連付けられています。何かのようなもの<something>/row_id

どうすればこれを簡単に行うことができますか?

Doctrine Livecycle コールバックを試しています。しかし:

  • PrePersist にはまだ ID がありません。
  • PostPersist には ID がありますが、どういうわけか挿入は既に行われており、Entity から任意のプロパティを設定できますが、データベースに「再び」永続化する方法がわかりません。

そこに手がかりはありますか?

それを適切に行う他の方法はありますか?

4

1 に答える 1

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())));
    }

2 番目のブロック ($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);
} } }
于 2012-12-10T23:47:09.693 に答える