2014-02-10 1 views
10

Symfony2의 특정 user_id와 일치하는 데이터베이스에서 모든 레코드를 삭제하고 싶습니다.symfony2 Doctrine 객체 배열 삭제

$em = $this->getDoctrine()->getManager(); 
$user_service = $em->getRepository('ProjectTestBundle:UserService') 
->findByUser($this->getUser()->getId()); 

이 몇 일치하는 객체를 반환 할 수 있습니다, 그래서 실행하면

$em->remove($user_service); 
$em->flush(); 

오류가 발생합니다

EntityManager#remove() expects parameter 1 to be an entity object, array given. 

을 내가 특정 일치하는 모든 레코드 (개체)를 제거하려면 어떻게 조건? Btw, mysql에서 동등한 sql 문을 실행하면 완벽하게 작동합니다.

답변

18

왜 객체 배열을 순환시켜야합니까?

$user_services = $em->getRepository('ProjectTestBundle:UserService') 
->findByUser($this->getUser()->getId()); 

foreach ($user_services as $user_service) { 
    $em->remove($user_service); 
} 

$em->flush(); 
+0

대단히 감사합니다. Markus. – Davit

+0

문제 없음, 때때로 나무를위한 숲이 보이지 않음 ... 발생 : P –

+0

실은 :)) 나는 while/for 루프 전에 시도했다. foreach에 대해 잠시 잊어 버렸습니다. – Davit

3

또한이 같은 것을 사용할 수 있습니다

protected function deleteEntity($entity, $key, $em) 
{ 
    $em->remove(entity); 
} 

를하거나 사용 :

$user_services = $em->getRepository('ProjectTestBundle:UserService')->findByUser($this->getUser()->getId()); 
array_walk($user_services, array($this, 'deleteEntity'), $em); 
$em->flush(); 

그런 다음 컨트롤러에서이 방법을 추가

$user_services = $em->getRepository('ProjectTestBundle:UserService')->findByUser($this->getUser()->getId()); 
$this->deleteEntities($em, $user_services); 
$em->flush(); 

... 

protected function deleteEntities($em, $entities) 
{ 
    foreach ($entities as $entity) { 
     $em->remove($entity); 
    } 
} 

주를이을 사용할 때및 PropelBundle 인 경우 PropelObjectCollectiondelete() 기능을 구현하므로 수동으로이 루프를 수행 할 필요가 없습니다.

->findOneByUser, 

당신은 foreach 루프가 필요하지 않습니다 : 한 개체를 반환하는 경우

+0

첫 번째 방법은'array_walk ($ user_services, array ($ em, 'remove'));' ? –

+0

네, 실제로는 deleteEntities 메소드에 있으므로 매번이 코드를 다시 작성할 필요가 없습니다. – COil

-1

, 당신은 단지 작성해야합니다. 반환 값이 배열 인 경우 ->findByUser을 수행하고 for 루프를 작성해야합니다.

foreach ($entities as $entity) 
{ 
    //do something 
}