Подтвердить что ты не робот

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.

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

4b9b3361

Ответ 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.

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