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());
Эта попытка не выполняется с помощью Exception 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.
Любые идеи и примеры будут приветствоваться.
Ответы
Ответ 1
Вы работаете с DQL, а не с SQL, поэтому не указывайте идентификаторы в своем состоянии, вместо этого ссылайтесь на объект.
Итак, ваш первый пример будет изменен на:
$qb = $em->createQueryBuilder();
$qb->delete('Services', 's');
$qb->where('s.project = :project');
$qb->setParameter('project', $project);
Ответ 2
Если вы действительно не можете получить объект проекта, и вы должны обращаться только с id, вы можете использовать это.
Цитата из документации доктрины:
Есть две возможности для массового удаления с помощью Doctrine. Вы можете либо выдать один запрос DQL DELETE, либо вы можете перебирать результаты, удаляя их по одному. (Ниже я вставляю только первое решение)
Запрос DQL
Наиболее эффективным способом массового удаления является использование запроса DQL DELETE.
Пример, который работал в моем проекте
$q = $em->createQuery('delete from AcmeMyTestBundle:TemplateBlock tb where tb.template = '.intval($templateId));
$numDeleted = $q->execute();
В объекте TemplateBlock у меня есть свойство, называемое шаблоном, которое сопоставляется с template_id в db.
Но я согласен с тем, что очень предпочтительный способ сделать это - использовать объекты.