2012-12-27 2 views
1

0..n 자녀가있는 부모를 고려하십시오. 부모로부터 자식을 제거하고 부모 개체를 유지하면 자식을 제거해야합니다. 현재, 내가 그 작업을 가지고있는 유일한 방법은 실제로 같은 같은뿐만 아니라 아동을 제거하는 것입니다 :Symfony2 doctrine 캐스케이드 삭제 자식 관계

$parent->removeChild($child); 
$em->remove($child); 

는 내가 부모를 제거하면 전체 아동의가 제거되고 있기 때문에 나의 관계가 올바르게 설정 생각 DB도. 왜 다음 줄이 자식을? 제거 충분하지

$parent->removeChild($child); 

약간의 배경 정보 : 나는 X의 자식 개체와 부모 개체를 업데이트하기 위해 노력하고, 내가 이전에 관련 지을 필요가 자녀의 새로운 자녀의에를 제거한다 추가 될 수 있습니다. 그러나 제거 및/또는 추가 할 컬렉션을 찾기 위해 두 컬렉션을 반복해야한다고 생각합니다.

누구나 명확한 예가 있습니까? Symfony/Doctrine의 문서를 잊어 버리십시오. 나는 그것을 전부 읽었다!

+1

문서에 따르면 두 가지를 모두 수행해야하지만이를 함수로 캡슐화하는 것이 좋습니다. – jaudette

답변

2

어린이들은 자신의 목숨을 가지고 있으며 부모님과 별거하기 때문에 아이들을 벗어 버려서는 안됩니다. 다른 방법으로 말하자면, 이것들은 별도의 엔티티이며, 릴레이션을 깨뜨릴 수 있지만 여전히 두 객체를 유지하고자하는 많은 사용 사례가 있으므로 관계를 제거 할 때 객체를 자동으로 제거하지 않습니다.

본능이 맞았으므로 두 목록 모두를 반복해야합니다. 나는 당신이 모든 문서를 읽었다 고 말했지만, How to Embed a Collection of Forms의 끝 부분을 다시 한번 보았습니다. 여기에는 정확하게 수행하는 부모 객체에 대한 작업 편집 기능이 포함되어 있습니다.

+0

귀하의 설명은 공정하게 들립니다. 내가 언급 한 반복은 여러분이 지적한 문서와 정확히 같습니다. 그러나, 나는 웹에 대한 컨트롤러와 내 부모 개체 자식을 편집하는 REST API 컨트롤러가 있습니다. 문서를 보면, 이는 아이 관계를 처리하기 위해 "foreach"문장이 4 개 있다는 것을 의미합니다. 두 개의 별도 컨트롤러가 있다는 것은 사실상 자식을 업데이트하기 위해 단지 8 개의 명령문이 필요하다는 것을 의미합니다. 나는 이것이 더 깔끔하고 쉬운 방법으로 행해질 수 있다고 느꼈습니까? – symfoon

+0

iterating이 아니라는 관점에서 php는 실제로이 것을 직접 처리해야하는 일종의 데이터 구조 (python dict 등)를 가지고 있지 않습니다. 당신은 아마 더 효율적인 것을 엔지니어링 할 수 있지만, 큰 배열을 다루지 않는다면 큰 문제가되지 않을 것입니다. 코드 효율성에 관해서는, 당신은 맞습니다. 불필요하게 반복적입니다. @jaudette이 제안했듯이, 나는 엔티티에 대한 교리 클래스에있는 함수에서 전체 프로세스를 캡슐화합니다. 다음에는 $ object-> editChildren ($ array)을 호출하고 모든 로직을 한 곳에 보관할 수 있습니다. – MrGlass

+0

알겠습니다. 답변으로 표시하겠습니다. 귀하의 의견을 보내 주셔서 감사합니다! – symfoon

1

부모가 없으면 부모 엔 존재하지 않아야하고 부모가 개인적으로 자식을 소유 한 경우 orphanRemoval을 사용할 수 있습니다.

/** 
* @OneToOne(targetEntity="StandingData", orphanRemoval=true) 
*/ 
private $standingData; 

$contact->standingData(new StandingData("Firstname", "Lastname", "Street")); 

연락처에 오래된 "standingData"가있는 경우 DB에서 삭제됩니다. 자세한 내용은 http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/working-with-associations.html#orphan-removal을 참조하십시오.