5

関連するエンティティを持つエンティティをマージすると、永続化操作とマージ操作の両方をカスケードするように設定され、関係が失われます。

エンティティは次のとおりです。

class Event implements NormalizableInterface
{
    /**
     * @ORM\ManyToMany(targetEntity="Participant", inversedBy="events", cascade={"persist", "merge"})
     * @ORM\JoinTable(name="event_participant",
     *      joinColumns={@ORM\JoinColumn(name="event_id", referencedColumnName="id", onDelete="CASCADE")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="participant_id", referencedColumnName="id", onDelete="CASCADE")}
     *      )
     */
    private $participants;
}


class Participant implements NormalizableInterface
{
    /**
     * @ORM\ManyToMany(targetEntity="Event", mappedBy="participants", cascade={"persist", "merge"})
     */
    protected $events;
}

ここに私の結合があります:

foreach ($events as $event)
{
    if (!$event->hasParticipant($participant)) {

        $event->addParticipant($participant);
    }
    if (!$participant->hasEvent($event)) {

        $participant->addEvent($event);
    }
}

ここに私のマージコードがあります:

echo "Before merge participant count: ".count($event->getParticipants()).PHP_EOL;

$event = $em->merge($event);

echo "After merge participant count: ".count($event->getParticipants()).PHP_EOL;

...そしてここに出力があります:

Before merge participant count: 2
After merge participant count: 0

..データベースは次のようになります。

table               | rows
-------------------------------
event               | 1
-------------------------------
participant         | 2
-------------------------------
event_participant   | 0
-------------------------------

私が馬鹿げているところを誰かが見ることができますか?

ところで、これよりも多くの関係があります。ここでは、説明を明確にするために単純化しています。私の他の関係は、マージによって悪影響を受けません。また、コントローラーではなくコンソールコマンドでマージを行っています。役立つ場合は、さらにコードを投稿できます:)

また、Doctrine 2.1.7 と Symfony 2.0.15 を使用しています

どうもありがとう、マシュー

4

3 に答える 3

3

私は同じ問題に直面し、マージ後にエンティティを更新して修正しました:

$mergedEntity = $entityManager->merge($serializedEntity);
$entityManager->refresh($mergedEntity);
于 2015-07-11T20:02:18.283 に答える
1

私は同じ問題を発見し、数分考えた後、コードの順序を変更し、マージされたものをエンティティの新しいインスタンスとして扱うだけで、簡単に考えてみました。マージアクションが関係を削除している可能性があることがわかりました。

$user = new User();
$user->setName('name');
$user->setAge('24');

$mergedUser = $em->merge($user);

// Imagine we have some groups to add
foreach ($groups as $group) {
    $mergedUser->addGroup($group);
}

$em->flush();

それは私のために働きます。

お役に立てば幸いです。

于 2014-07-28T18:31:48.483 に答える
0

この問題はマージとは関係ありません: http://doctrine-orm.readthedocs.org/en/2.0.x/reference/limitations-and-known-issues.html#cascade-merge-with-bi-directional-associations ?

于 2012-07-19T07:57:30.120 に答える