해결 방법은 EntityB
(처음)에서 EntityA
에 대한 참조를 제거하는 것입니다. 이 경우 Doctrine은 EntityB
을 유지하지 않습니다. 우리가 orphanRemoval=true
와 함께이 결합한다면, 우리는 목표 결과를 얻을 수 있습니다 :
class EntityA
{
...
/**
* @var ArrayCollection
* @ORM\OneToMany(targetEntity="EntityB", mappedBy="entityA", cascade={"persist"}, orphanRemoval=true)
*/
protected $entityBs;
...
public function removeEntityB(EntityB $entityB)
{
$this->entityBs->removeElement($entityB);
$entityB->setEntityA(null);
return $this;
}
...
}
class EntityB
{
...
/**
* @var EntityA
*
* @ORM\ManyToOne(targetEntity="EntityA", inversedBy="entityBs")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="entity_a_id", referencedColumnName="id")
* })
*/
protected $entityA;
...
/**
* @param EntityA $entityA
* @return EntityB
*/
public function setEntityA(EntityA $entityA = null)
{
$this->entityA = $entityA;
return $this;
}
...
}
주제 오프
: 나는 질문에서 언급하기 때문에 장점이 될 것이라고, 모음
교체 그 중 하나는 EntityA#replaceEntityBs(ArrayCollection $entityBs)
과 같은 메소드를 구현할 수 있습니다. 가능한 구현을 여기에서 공유하고 싶습니다.
첫 번째 순진한 시도는 모두EntityBs
을 제거한 다음 새 요소를 추가 (지속)했습니다.
public function setEntityBs($entityBs)
{
$this->removeEntityBs();
$this->entityBs = new ArrayCollection([]);
/** @var EntityB $entityB */
foreach ($entityBs as $entityB) {
$this->addEntityB($entityB);
}
return $this;
}
public function removeEntityBs()
{
foreach ($this->getEntityBs() as $entityB) {
$this->removeEntityB($entityB);
}
return $this;
}
그러나 경우
의 입력 콜렉션
setEntityBs(...)
포함 된
EntityBs
(즉 업데이트 할 놈이야)은 지속되었다 그들 중 삭제 만 새로운 요소되었다 기존의.
public function setEntityBs($entityBs)
{
$this->removeEntityBsNotInList($entityBs);
$this->entityBs = new ArrayCollection([]);
/** @var EntityB $entityB */
foreach ($entityBs as $entityB) {
$this->addEntityB($entityB);
}
return $this;
}
private function removeEntityBsNotInList($entityBs)
{
foreach ($this->getEntityBs() as $entityB) {
if ($entityBs->indexOf($entityB) === false) {
$this->removeEntityB($entityB);
}
}
}
: 여기
는 바란 작동하는 솔루션입니다