Ответ 1
Doctrine рассматривает данные как объекты, а не как строки таблицы. Итак, в терминах Doctrine существуют объекты Group (среди которых, среди прочего, есть пользователи группы), и есть объекты User (каждый из которых имеет свойство хранить группы, в которых находится пользователь). Но нет объектов UserGroup. Идея Doctrine (и любой системы ORM) заключается в том, чтобы позволить разработчику забыть об этих промежуточных таблицах, которые могут понадобиться базе данных, но которые не нужны в отношении объектной модели программы.
Итак, что вы хотите сделать, это загрузить соответствующий объект User, удалить из него свойство $groups и сохранить измененный объект User. (Или наоборот, т.е. загрузите соответствующий объект Group и удалите из него пользователя.) DQL может справиться с этим, но я думаю, что это проще сделать без DQL, поскольку инструкция DQL DELETE предназначена для удаления целых объектов, а не изменяя их свойства.
Try:
$user = $em->find('User', $userId);
$user->removeGroup($groupId); //make sure the removeGroup method is defined in your User model.
$em->persist($user);
$em->flush(); //only call this after you've made all your data modifications
Примечание: если у вас нет метода removeGroup() в вашей модели пользователя (я думаю, что Symfony может сгенерировать его для вас, но я могу ошибаться), метод может выглядеть следующим образом.
//In User.php, and assuming the User groups are stored in $this->groups,
//and $groups is initialized to an empty ArrayCollection in the User class constructor
//(which Symfony should do by default).
class User
{
//all your other methods
public function removeGroup($group)
{
//optionally add a check here to see that $group exists before removing it.
return $this->groups->removeElement($group);
}
}