関連するエンティティを持つエンティティをマージすると、永続化操作とマージ操作の両方をカスケードするように設定され、関係が失われます。
エンティティは次のとおりです。
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 を使用しています
どうもありがとう、マシュー