2013-08-30 4 views
3

오늘 당신의 도움이 필요합니다.symfony2는 많은 관계를 삭제하고 저장합니다

class Usuario implements UserInterface { 
/** 
* @ORM\ManyToMany(targetEntity="Alood\BackBundle\Entity\Alergeno", inversedBy="usuarios") 
* @ORM\JoinTable(name="UsuariosProductos", 
*  joinColumns={@ORM\JoinColumn(name="usuario_user", referencedColumnName="user")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="alergeno_id", referencedColumnName="id")} 
*  ) 
**/ 
protected $alergenos; 
} 


public function __construct(){ 
    $this->alergenos = new ArrayCollection(); 
} 

public function getAlergenos() { return $this->alergenos; } 

과 :

/** 
* @ORM\ManyToMany(targetEntity="Alood\BackBundle\Entity\Usuario", mappedBy="alergenos") 
**/ 
protected $usuarios; 

내가 심포니 2.1을 사용하여 작은 응용 프로그램에서 일하고 있어요하지만 기본 문제가, 나는 세 번째 테이블을 생성하는 많은 관계로 많은으로 테이블이 그런 다음 선택되지 않은 Alergenos을 제거해야합니다. 내 컨트롤러입니다.

$alergenosUser = $em->getRepository("BackBundle:Usuario")->find($usuario); 

$resultSym = array_diff($alergenosUsuarioIds, $alergen); 

foreach($resultSym as $result) { 
    $alergenosUser->getAlergenos()->remove($result); 
} 
$em->persist($alergenosUser); 
$em->flush(); 

내가 잘못하고있는 것을 알아내는 데 도와 주시겠습니까? 정말 감사합니다! 사용 컬렉션에서 항목을 제거하기 위해

+0

코드에 어떤 문제가 있습니까? ... 당신은 이미이 경우에 필요하지 않은 교리에 의해 이미 관리되고있는 객체를 계속 유지하고 있습니까? :) – nifr

+0

내가 사용자 1과 알레르기 항원 1을 가지고 있다고 말한 다음 사용자 1에게 알레르기가 있다고 말하면 그럴 수 있지만 그 연결 (사용자 1은 더 이상 알레르기 항원 1에 알레르기가 없음)을 삭제하려고 할 때 그 관계를 삭제할 수 없습니다. – soni

답변

4

다음 찾으면 removeElement($item) 컬렉션에서 항목을 제거하면서

$collection->removeElement($item); 

remove($key) 기능 키에 의해 제거된다. ArrayCollection code here을 살펴보십시오.

doctrine은 변경 사항에 대한 릴레이션의 소유 측만을 점검한다는 점에 유의하십시오.

+0

그래서 $ em-> persist ($ alergenosUser)를 변경해 보았습니다. $ em-> remove ($ alergenosUser)를 위해; 하지만 그것은 심지어 모든 사용자를 삭제, 난 단지 세 번째 테이블에서 데이터를 제거하고 싶습니다. 제발 도와 주실 수 있나요? – soni

+0

두 엔터티 사이의 관계를 제거하기를 원하십니까?(조인트 가능에서 테이블 행을 제거하게됩니다) – nifr

+0

정확히! 그게 내가 원하는거야 :) – soni

0

$alergenosUsuarioIds$alergen 변수가 무엇을 나타내는지는 분명하지 않지만 방법의 사용에 대해 실수로 생각하면 ArrayCollection 일 수 있습니다. 제거하려는 엔티티의 ID가 아닌 색인을 제공해야합니다. removeElement() 메서드를 사용하여 엔터티를 전달할 수도 있습니다.

는 예를 들어 당신은 같은 것을 할 수 있습니다

$elements = $alergenosUser->getAlergenos(); 
foreach ($elements as $element) { 
    if ($element->getId() == $id_from_array_diff_or_whatever) { 
     $elements->removeElement($element); 
    } 
} 

또는

$elements = $alergenosUser->getAlergenos(); 
foreach ($elements as $key => $element) { 
    if ($element->getId() == $id_from_array_diff_or_whatever) { 
     $elements->remove($key); 
     // or 
     unset($elements[$key]); 
    } 
} 

은 또한 사용할 수있는 matching()하지만 난 그게 symfony2 2.1과 함께 제공되는 버전으로 사용할 수 모르겠어요.

0

그래서 문제는 직접 관계를 해결할 수 있습니다. ManyToMany는 실제로 존재하지 않습니다. 세 번째 테이블이 만들어 졌기 때문입니다. 이 세 번째 테이블에서만 요소를 삭제하려고합니다.

그래서 관계를 직접 만들어 세 번째 테이블의 요소를 직접 삭제해야합니다.

먼저 세 번째 엔티티를 만듭니다. 세 번째 엔티티에서 두 개의 다른 엔티티로 두 개의 관계 ManyToOne을 수행하십시오. 그러면 방금 만든 세 번째 엔티티의 요소를 제거하면됩니다.

+0

이것이 올바른 방법이 아니라고 생각합니다. $ collection-> removeElement ($ item); @nifr처럼 orphanRemoval = 내 교리 개체를 삭제해야했습니다. 어쨌든 고마워! – soni