У меня два объекта с отношением 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.
Любые идеи и примеры будут приветствоваться.
Вы работаете с 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.
Но я согласен с тем, что очень предпочтительный способ сделать это – использовать объекты.