2013-03-21 14 views
19

私は、関係OneToMany、ProjectおよびServicesを持つ2つのエンティティを持っています。今私はすべてのサービスをproject_idで削除したいと思います。Doctrine 2 delete with query builder

初の試み:

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

この試みは、例外Entity Service does not have property project_idで失敗します。そしてそれは事実です、そのプロパティは存在しません、それは外部キーとしてデータベーステーブル内にのみあります。

第二の試み:

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

この1 generetateあまりにも非有効なDQLクエリ。

すべてのアイデアと例を歓迎します。

答えて

40

あなたはSQLではなくDQLを使用していますので、あなたの状態のIDを参照しないで、代わりにオブジェクトを参照してください。あなたが本当にプロジェクトオブジェクトを取得できない場合

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

3行目は次のように書き直すことができます。$ qb-> where( 's.project =:project'); – Oli

6

、あなたがこれを使用することができる唯一のIDで処理する必要が:

だからあなたの最初の例は、に変更されるだろう。

Doctrine文書からの引用: Doctrineでの一括削除には2つの可能性があります。単一のDQL DELETEクエリを発行することも、結果を反復処理して一度に1つずつ削除することもできます。 (以下、最初のソリューションのみを貼り付けます)

DQLクエリ 一括削除の最も効率的な方法は、DQL DELETEクエリを使用することです。私はデシベルでTEMPLATE_IDするためにマッピングされているテンプレートと呼ばれるプロパティを持つエンティティTemplateBlockでは私のプロジェクトで

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

を働いた

例。

しかし、私はそれを行うのが非常に好ましい方法は、オブジェクトを使用していることに同意します。

+9

自宅でこれをしないでください、SQLインジェクションに注意してください! – chteuchteu

関連する問題