2013-11-10 2 views
4

Я пытаюсь сделать запрос для массового удаления, но, видимо, он не выполняет действия JOIN. Есть предположения?Symfony2 Bulk Удалить с QueryBuilder

$queryBuilder = $em 
       ->createQueryBuilder() 
       ->delete('Bundle:ClassA', 'a') 
       ->join('a.classB', 'b') 
       ->where('b = :parent') 
       ->setParameter('parent', $parent); 

     $queryBuilder->getQuery()->execute(); 

Это возвращает:

"[Semantical Error] line 0, col 38 near 'b = :parent AND': Error: 'b' is not defined."

ответ

3

попробовать это:

$queryBuilder = $em 
       ->createQueryBuilder() 
       ->delete('Bundle:ClassA', 'a') 
       ->innerJoin('a.classB', 'b') 
       ->where($qb->expr()->eq('b', ':parent')) 
       ->setParameter(':parent', $parent); 

     $queryBuilder->getQuery()->execute(); 
+0

Спасибо за ответ mansoulx, я попробовал, но все, что я получаю пустую страницу (сервер идет вниз, и я должен перезапустить Apache, чтобы получить его снова). Есть предположения? – ikleiman

+0

- это ваш объект 'ClassA', связанный с сущностью' ClassB'? вы снова попробовали и получили сообщение об ошибке? я не знаю, почему у вас пустая страница (может быть, вы где-нибудь выходите из кода)! –

+0

Да, с отношением ManyToOne, являющимся родителем ClassB ClassA. Согласен, очень странно. Спускается вниз на "-> где ($ qb-> expr() -> eq ('b', ': parent'))", если я прокомментирую эту строку, она выведет ожидаемую ошибку на следующую. – ikleiman

4

DQL не поддерживает присоединяется УДАЛИТЬ и ее корректуры, даже если нижележащий базы данных, как MySQL, поддерживает его.

Это quickiest обходной путь:

$results = $em 
    ->createQueryBuilder() 
    ->select('Bundle:ClassA', 'a') 
    ->join('a.classB', 'b') 
    ->where('b = :parent') 
    ->setParameter('parent', $parent) 
    ->getQuery()->getResult(); 

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

$em->flush(); 
Смежные вопросы