2013-03-21 19 views
19

Mam dwa elementy o relacji OneToMany, Project i Services. Teraz chcę usunąć wszystkie usługi przez project_id.Doctrine 2 delete with query builder

Pierwsza próba:

$qb = $em->createQueryBuilder(); 
$qb->delete('Services','s'); 
$qb->andWhere($qb->expr()->eq('s.project_id', ':id')); 
$qb->setParameter(':id',$project->getId()); 

Ta próba nie powiedzie się z wyjątkiem Entity Service does not have property project_id. I to prawda, że ​​właściwość nie istnieje, jest tylko w tabeli bazy danych jako klucz obcy.

Druga próba:

$qb = $em->createQueryBuilder(); 
$qb->delete('Services','s')->innerJoin('s.project','p'); 
$qb->andWhere($qb->expr()->eq('p.id', ':id')); 
$qb->setParameter(':id',$project->getId()); 

Ten generetate non ważny zapytania DQL też.

Wszelkie pomysły i przykłady będą mile widziane.

Odpowiedz

40

Pracujesz z DQL, nie SQL, więc nie odwołuj się do identyfikatorów w swoim stanie, odwołaj się do obiektu.

Więc twój pierwszy Przykładem może być zmieniony na:

$qb = $em->createQueryBuilder(); 
$qb->delete('Services', 's'); 
$qb->where('s.project = :project'); 
$qb->setParameter('project', $project); 
+0

Trzecią linię można przepisać w następujący sposób: $ qb-> where ('s.project =: project'); – Oli

6

Jeśli naprawdę nie można dostać przedmiot projektu i trzeba obsłużyć tylko z identyfikatorem można to wykorzystać.

Cytat z dokumentacji doktryny: Istnieją dwie możliwości usuwania zbiorczego za pomocą Doctrine. Możesz wydać jedno zapytanie DELETE DQL lub możesz iterować wyniki usuwając je pojedynczo. (Poniżej wkleję tylko pierwsze rozwiązanie)

Zapytanie DQL Najskuteczniejszym sposobem usuwania zbiorczego jest użycie kwerendy DQL DELETE.

Przykład, który pracował w moim projekcie

$q = $em->createQuery('delete from AcmeMyTestBundle:TemplateBlock tb where tb.template = '.intval($templateId)); 
$numDeleted = $q->execute(); 

w jednostce TemplateBlock mam właściwość o nazwie szablonu, który jest mapowany do template_id w db.

Ale zgadzam się, że bardzo preferowanym sposobem na to jest używanie obiektów.

+9

Nie rób tego w domu, pamiętaj o zastrzykach SQL! – chteuchteu