1

ログを作成するためにリスナーをテストしていますが、新しく作成されたオブジェクトの ID を取得する方法がわかりません。私が使用する方法は次のとおりです。

class ListenerCrud{

protected $container;

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

public function onFlush(onFlushEventArgs $eventArgs)
    {
            $em = $eventArgs->getEntityManager();
            $uow = $em->getUnitOfWork();

            foreach ($uow->getScheduledEntityInsertions() AS $entity) {
                if (!$entity instanceof Modificacion) {
                    $modificacion = new Modificacion();
                    $modificacion->setFechamod(new \DateTime('now'));
                    $className = join('', array_slice(explode('\\', get_class($entity)), -1));
                    $modificacion->setEntidad($className);
                    $modificacion->setTipo('Inserción');
                    $modificacion->setIdentificador($entity->getId()); //errorrrrrrrr
                    $securityContext = $this->container->get('security.context');
                    $modificacion->setEmpleado($securityContext->getToken()->getUser());
                    $modificacion->setInfo('');
                    $em->persist($modificacion);
                    $classMetadata = $em->getClassMetadata(get_class($modificacion));
                    $uow->computeChangeSet($classMetadata, $modificacion);
                    }
                 }
    }
}

新しく作成されたオブジェクトのIDにアクセスできません。誰かが私を助けることができますか?どうもありがとうございます。

4

3 に答える 3

0

あなたの答えに感謝します。

解決策は次のとおりです。

    $objetos = $em->getRepository('miomioBundle:'.$className)->findAll();
    $last_item = end($objetos);
    $last_item = $last_item->getId() + 1; 
    $modificacion->setIdentificador($last_item);
于 2012-10-08T16:01:42.120 に答える
0

すると$em->persist($modificacion);、データをオブジェクトに保存しますが、id割り当てていないため、まだ保存されていません。データをデータベースに保存するに$em->flush();は、オブジェクトが ID を取得した後に実行する必要があります。

したがって、最も簡単な解決策は次のとおりです。

foreach ($uow->getScheduledEntityInsertions() AS $entity) {
    if (!$entity instanceof Modificacion) {
        $modificacion = new Modificacion();
        $modificacion->setFechamod(new \DateTime('now'));
        $className = join('', array_slice(explode('\\', get_class($entity)), -1));
        $modificacion->setEntidad($className);
        $modificacion->setTipo('Inserción');
        $modificacion->setIdentificador($entity->getId()); //errorrrrrrrr
        $securityContext = $this->container->get('security.context');
        $modificacion->setEmpleado($securityContext->getToken()->getUser());
        $modificacion->setInfo('');
        $em->persist($modificacion);

        $em->flush(); // now you can doSmthWithId($modificacion->getId())

        $classMetadata = $em->getClassMetadata(get_class($modificacion));
        $uow->computeChangeSet($classMetadata, $modificacion);
    }
}
于 2012-10-08T13:00:09.820 に答える
0

postFlush別のイベント (またはpostUpdate/ postRemove/postPersist ) をリッスンする必要があります。

于 2012-10-08T13:47:36.647 に答える