合并一个具有相关实体的实体,并将关系设置为级联保持和合并操作后,关系就会丢失!
以下是实体:
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
非常感谢,马修
答案 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)