5

After merging an entity that has related entities with relations set to cascade both persist and merge operations the relations are lost!

Here are the entities:

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

Here are my joins:

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

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

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

Here is my merge code:

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

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

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

...and here is the output:

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

..and the database looks like this:

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

Can anyone see where I'm being dumb?

BTW there are more relationships than this. I've simplified things here to make the explanation clearer. My other relations aren't affected negatively by the merge. Also I'm doing the merge in a console Command not a in a controller. I can post more code if it'll help :)

Also I'm using Doctrine 2.1.7 and Symfony 2.0.15

Many thanks, Matthew

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 回答