Doctrine QueryBuilder 結合による削除 質問する

Doctrine QueryBuilder 結合による削除 質問する

Doctrine QueryBuilder を使用して次の SQL クエリを実行しようとしています。

DELETE php FROM product_hole_pattern php
INNER JOIN hole_pattern hp ON php.hole_pattern_id = hp.id
INNER JOIN hole_pattern_type hpt ON hp.hole_pattern_type_id = hpt.id
WHERE php.product_id = 4 AND hpt.slug='universal';

私はこれを持っています

$qb = $this->entityManager->createQueryBuilder();
$query = $qb->delete('\SANUS\Entity\ProductHolePattern', 'php')
  ->innerJoin('php.holePattern', 'hp')
  ->innerJoin('hp.holePatternType', 'hpt')
  ->where('hpt.slug = :slug AND php.product=:product')
  ->setParameter('slug','universal')
  ->setParameter('product',$this->id)
  ->getQuery();

しかし、私はこう思います:

[Semantical Error] line 0, col 50 near 'hpt.slug = :slug': Error: 'hpt' is not defined.

エラー メッセージに付属する DQL は次のとおりです。

DELETE \SANUS\Entity\ProductHolePattern php 
WHERE hpt.slug = :slug AND php.product=:product

したがって、結合は完全に省略されているようです。

ベストアンサー1

反復処理よりも IN 条件を使用してクエリを実行する方がよい場合があります。

$ids = $this->createQueryBuilder('product')
->join('..your joins..')
->where('..your wheres..')
->select('product.id')
->getQuery()->getResult();

$this->createQueryBuilder('product')
    ->where('product.id in (:ids)')
    ->setParameter('ids', $ids)
    ->delete()
    ->getQuery()
    ->execute();
  • 利点: 実行速度が速く、反復処理が不要
  • 欠点: preRemoveにフックできない

「どこに置くか」という白熱した議論については、思い切ってコントローラーに置いてみましょう。それは完全にあなた次第です。ただし、専用の doctrine リポジトリ クラスにコードを配置すると、将来的にもっと便利になるかもしれません。これは非常に簡単に実行でき、変更や保守も容易になります。

おすすめ記事