2013-03-21 6 views
19

Ich habe zwei Entitäten mit Beziehung OneToMany, Project und Services. Jetzt möchte ich alle Dienste durch project_id entfernen.Doctrine 2 löschen mit Abfrage-Generator

Erster Versuch:

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

Dieser Versuch schlägt fehl mit der Ausnahme Entity Service does not have property project_id. Und es ist wahr, dass die Eigenschaft nicht existiert, sondern nur in der Datenbanktabelle als Fremdschlüssel.

Zweiter Versuch:

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

Dieser generetate eine nicht gültige DQL-Abfrage zu.

Alle Ideen und Beispiele sind willkommen.

Antwort

40

Sie arbeiten mit DQL, nicht mit SQL, also referenzieren Sie nicht die IDs in Ihrer Bedingung, referenzieren Sie stattdessen das Objekt.

So Ihr erstes Beispiel würde geändert werden:

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

Dritte Zeile kann wie folgt umgeschrieben werden: $ qb-> where ('s.project =: project'); – Oli

6

Wenn Sie wirklich nicht Projektobjekt erhalten können und Sie haben nur zu handhaben mit id Sie diese nutzen können.

Zitat aus Doktrin-Dokumentation: Es gibt zwei Möglichkeiten für Massenlöschungen mit Doctrine. Sie können entweder eine einzelne DQL-DELETE-Abfrage ausgeben oder Sie können die Ergebnisse iterieren, indem Sie sie einzeln entfernen. (Im Folgenden werde ich nur die erste Lösung einfügen)

DQL Abfrage Der weitaus effizienteste Weg für Massenlöschungen ist eine DQL DELETE-Abfrage zu verwenden.

Beispiel die

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

In Unternehmen TemplateBlock in meinem Projekt arbeitete ich habe Eigenschaft namens Vorlage, die in db template_id abgebildet wird.

Aber ich stimme zu, dass sehr bevorzugte Art und Weise es zu tun ist mit Objekten.

+9

Tun Sie dies nicht zu Hause, bitte beachten Sie SQL-Injektionen! – chteuchteu

Verwandte Themen