2013-06-25 28 views
8

Tôi đang cố gắng sử dụng các học thuyết QueryBuilder để thực hiện các truy vấn SQL sau:thuyết QueryBuilder xóa với tham gia

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'; 

Tôi có điều này

$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(); 

nhưng tôi nhận được:

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

DQL đi kèm với thông báo lỗi là:

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

Vì vậy, các tham gia dường như bị bỏ qua hoàn toàn.

Trả lời

8

Một cách để thực hiện điều này có thể là để đầu tiên truy vấn các đối tượng mà bạn muốn xóa bằng cách sử dụng tham gia:

$qb = $this->entityManager->createQueryBuilder(); 
$query = $qb->select('\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(); 
$results = $query->execute(); 

Và sau đó xóa các đối tượng bạn tìm thấy trong kết quả:

foreach ($results as $result) { 
    $this->entityManager->remove($result); 
} 

Be hãy gọi số

$this->entityManager->flush(); 

tại vị trí thích hợp trong ứng dụng của bạn (thường là bộ điều khiển).

+1

Chỉ cần hai điều cần đề cập. 1. Điều này có thể rất tốn kém. 2. Đừng dám đặt một logic như vậy vào một bộ điều khiển! – EnchanterIO

+2

Điều thứ 3 - Điều này dễ bị điều kiện chạy đua. – Kaspars

7

Dường như DQL không hỗ trợ loại tuyên bố xóa này. Các BNF from the Doctrine documentation chỉ ra rằng một delete_statement phải mang hình thức

delete_clause [where_clause] 

đâu delete_clause được định nghĩa là:

"DELETE" "FROM" abstract_schema_name [["AS"] identification_variable] 

Vì vậy, tôi có thể cung cấp một lược đồ và một mệnh đề where, nhưng không tham gia.

-2

On Symfony2 hãy thử:

foreach ($results as $result) { 
    $em->remove($result); 
} 

$em->flush(); 

Thats tất cả.

+0

Trong trường hợp bạn cần xóa nhiều sắc thái hơn (ví dụ như câu hỏi gốc), phương thức '$ em-> remove ($ entity)' mặc định sẽ không hoạt động. –

Các vấn đề liên quan