2

uniqueConstraintsフィールド上にテストエンティティがありvalueます。

flush()新しい Test エンティティを追加し、既存の Test エンティティを次のようなもので更新したいと考えています。

 $new = new Test;
 $new->setValue('existing value');

 $old = $em->getRepository('TestBundle:Test')->findOneByValue('existing value'); 
 $old->setValue('new value);

 $em->flush();

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'existing value'

これは、新しいエンティティを挿入する前に古いエンティティが更新されていないために発生します。

ONE flush() でそれを行うことは可能ですか?

4

2 に答える 2

0

私はそうは思わない。Flushは、最初に挿入を実行し、その後更新するUnitOfWork::commitメソッドを実行しています。

try {
        if ($this->entityInsertions) {
            foreach ($commitOrder as $class) {
                $this->executeInserts($class);
            }
        }

        if ($this->entityUpdates) {
            foreach ($commitOrder as $class) {
                $this->executeUpdates($class);
            }
        }

        // Extra updates that were requested by persisters.
        if ($this->extraUpdates) {
            $this->executeExtraUpdates();
        }

        // Collection deletions (deletions of complete collections)
        foreach ($this->collectionDeletions as $collectionToDelete) {
            $this->getCollectionPersister($collectionToDelete->getMapping())->delete($collectionToDelete);
        }
        // Collection updates (deleteRows, updateRows, insertRows)
        foreach ($this->collectionUpdates as $collectionToUpdate) {
            $this->getCollectionPersister($collectionToUpdate->getMapping())->update($collectionToUpdate);
        }

        // Entity deletions come last and need to be in reverse commit order
        if ($this->entityDeletions) {
            for ($count = count($commitOrder), $i = $count - 1; $i >= 0; --$i) {
                $this->executeDeletions($commitOrder[$i]);
            }
        }

        $conn->commit();
    } catch (Exception $e) {
        $this->em->close();
        $conn->rollback();

        throw $e;
    }
于 2012-11-07T09:53:29.000 に答える
-1

$em->persist($new); を追加すべきではありませんか? $new->setValue('既存の値');?

于 2020-09-24T13:44:28.750 に答える