varios una tabla relaciĆ³n relacion muchos llenar intermedia ejemplos datos como codigo cardinalidad doctrine symfony many-to-many dql

doctrine - una - Borrado de registro en tabla de muchos a muchos



relacion uno a varios ejemplos (2)

Estoy siguiendo el capítulo de seguridad del libro de Symfony 2.

Hay un ejemplo con una tabla USERS y GROUPS . Existe una relación de muchos a muchos entre USERS y GROUPS , que crea en la base de datos una tabla llamada USERGROUPS .

Lo que quiero es eliminar un registro de USERGROUPS , por ejemplo:

DELETE from USERGROUPS WHERE user_id = 1 and group_id = 1

No sé cómo hacer esto porque no tengo un archivo de tabla USERGROUPS.php .

Usando DQL, por ejemplo, quiero poder hacer esto:

$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));

Espero que captes la idea.

Entonces, ¿cómo elimino de esta tabla?


Además de la respuesta de @ Ethan, la eliminación en una sola dirección no funciona. Para tal relación manyToMany , debe llamar a los métodos de remove de ambas entidades, por ejemplo,

$user = $em->findOneById($userId); $group = $em->findOneById($groupId); $user->removeGroup($group); $group->removeUser($user); $em->persist($user); $em->flush();


Doctrine piensa en los datos como objetos, en lugar de como filas de tablas. Entonces, en términos de Doctrine, hay objetos de grupo (que contienen a los usuarios del grupo, entre otras cosas) y hay objetos de usuario (cada uno de los cuales tiene una propiedad que almacena los grupos en los que se encuentra el usuario). Pero no hay objetos UserGroup. La idea de Doctrine (y cualquier sistema ORM) es permitir que el desarrollador olvide estas tablas intermedias que la base de datos podría necesitar pero que no son necesarias en términos del modelo de objetos del programa.

Entonces, lo que desea hacer es cargar el objeto Usuario relevante, eliminar el grupo de su propiedad $ grupos y conservar el objeto Usuario modificado. (O viceversa, es decir, cargue el objeto de Grupo relevante y elimine al Usuario de él). DQL podría ser capaz de manejar esto, pero creo que es más fácil hacerlo sin DQL, ya que la instrucción DELETE de DQL es para eliminar objetos enteros, no modificando sus propiedades.

Tratar:

$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

Nota: si no tienes un método removeGroup () en tu modelo de usuario (creo que Symfony puede generar uno para ti, pero podría estar equivocado), el método podría tener el siguiente aspecto.

//In User.php, and assuming the User''s groups are stored in $this->groups, //and $groups is initialized to an empty ArrayCollection in the User class''s 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); } }