Doctrine 2 delete с построителем запросов

У меня два объекта с отношением OneToMany, Project и Services . Теперь я хочу удалить все сервисы project_id.

Первая попытка:

 $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 исключений 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()); 

Это также создает недействительный запрос DQL.

Любые идеи и примеры будут приветствоваться.

Solutions Collecting From Web of "Doctrine 2 delete с построителем запросов"

Вы работаете с DQL, а не с SQL, поэтому не указывайте идентификаторы в своем состоянии, вместо этого ссылайтесь на объект.

Таким образом, ваш первый пример будет изменен:

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

Если вы действительно не можете получить объект проекта, и вы должны обращаться только с id, вы можете использовать это.

Цитирование из документации доктрины. Существует две возможности для массового удаления с помощью Doctrine. Вы можете либо выдать один запрос DQL DELETE, либо вы можете перебирать результаты, удаляя их по одному. (Ниже я вставляю только первое решение)

DQL Query Наиболее эффективным способом массового удаления является использование запроса DQL DELETE.

Пример, который работал в моем проекте

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

В объекте TemplateBlock у меня есть свойство, называемое шаблоном, которое сопоставляется с template_id в db.

Но я согласен с тем, что очень предпочтительный способ сделать это – использовать объекты.