【发布时间】:2015-11-19 15:34:13
【问题描述】:
在合并一个具有相关实体且关系设置为级联持久化和合并操作的实体后,关系将丢失!
以下是实体:
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
非常感谢,马修
【问题讨论】:
-
原则 ORM 文档建议在合并的情况下使用受保护属性而不是私有属性。我认为值得一试。另外,你为什么要使用合并?
标签: symfony merge doctrine-orm many-to-many cascade