Doctrine 2.1 - 在ManyToMany级联合并之后失去了关系 - Symfony2

时间:2012-06-25 22:43:14

标签: symfony merge doctrine-orm many-to-many cascade

合并一个具有相关实体的实体,并将关系设置为级联保持和合并操作后,关系就会丢失!

以下是实体:

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

非常感谢,马修

3 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,并通过在合并后刷新实体来修复它:

$mergedEntity = $entityManager->merge($serializedEntity);
$entityManager->refresh($mergedEntity);

答案 1 :(得分:1)

我发现了同样的问题,在思考了几分钟之后我尝试了一个简单的想法,只需更改代码顺序并将合并视为实体的新实例,我发现合并操作可以删除关系,所以:< / p>

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

它适用于我。

我希望它有所帮助。

答案 2 :(得分:0)