Удаление записи во многих таблицах - программирование
Подтвердить что ты не робот

Удаление записи во многих таблицах

Я следую главе безопасности в книге Symfony 2.

Есть пример с таблицей USERS и GROUPS. Между USERS и GROUPS существует много-много, которая создает в базе данных таблицу с именем USERGROUPS.

Я хочу удалить запись из USERGROUPS, например:

DELETE from USERGROUPS WHERE user_id = 1 and group_id = 1 

Я не знаю, как это сделать, поскольку у меня нет файла таблицы USERGROUPS.php.

Используя DQL, например, я хочу иметь возможность сделать это:

$em = $this->getDoctrine()->getEntityManager();
$query = $em->createQuery(
    'DELETE FROM AcmeStoreBundle:UserGroups ug WHERE ug.user_id = :user 
    and ug.group_id = :group'
)->setParameter(array('user' => $userid, 'group' => $groupid));

Надеюсь, у вас есть идея.

Затем, как удалить из этой таблицы?

4b9b3361

Ответ 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);
    }
}

Ответ 2

В дополнение к ответу @Ethan односторонний удаление не работает. Для такого отношения manyToMany вы должны вызвать методы remove для обоих объектов, например,

$user = $em->findOneById($userId);
$group = $em->findOneById($groupId);

$user->removeGroup($group);
$group->removeUser($user);

$em->persist($user);
$em->flush();