2011-12-30 12 views
27

Tengo una tabla de unión que se crea utilizando la anotación @ORM\ManyToMany en Symfony2/Doctrine. Se une a Category y Parameter tabla.Cómo eliminar filas de join-table (ManyToMany) en Doctrine?

Ahora quiero eliminar todos los parámetros de la tabla de parámetros. Debido a que hay restricciones de clave externa definidas en la tabla de unión, no puedo simplemente eliminar filas de la tabla de parámetros. Primero tengo que eliminar filas secundarias de join-table. Sin embargo, la sintaxis de DQL Dotrine requiere para dar un nombre de la entidad, como:

DELETE Project\Entity\EntityName 

Pero ¿cuál es el nombre de la entidad unirse a-tabla generada mediante el uso de la asociación ManyToMany? ¿Como lidiar con?

Alternativamente, ¿cómo puedo configurar ACTUALIZAR CASCADA y ACTIVAR ELIMINAR CASCADA en restricciones de clave externa en la tabla de unión definida por la anotación @ORM\ManyToMany?

EDIT:

esquema de unirse a la mesa:

CREATE TABLE `categories_params` (
    `category_id` INT(11) NOT NULL, 
    `param_id` INT(11) NOT NULL, 
    PRIMARY KEY (`category_id`, `param_id`), 
    INDEX `IDX_87A730CB12469DE2` (`category_id`), 
    INDEX `IDX_87A730CB5647C863` (`param_id`), 
    CONSTRAINT `categories_params_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `allegro_category` (`id`), 
    CONSTRAINT `categories_params_ibfk_2` FOREIGN KEY (`param_id`) REFERENCES `category_param` (`id`) 
) 
COLLATE='utf8_general_ci' 
ENGINE=InnoDB; 

on UPDATE y on DELETE por defecto se establecen en RESTRICT

la solución final sería:

* @ORM\ManyToMany(targetEntity="CategoryParam", cascade={"persist","remove"}) 
* @ORM\JoinTable(name="categories_params", 
*  joinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id", onDelete="CASCADE")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="param_id", referencedColumnName="id", onDelete="CASCADE")}) 
+0

Se puede publicar el esquema de la tabla? Sospecho que tiene una restricción FK en la tabla de unión para eliminar filas si se elimina alguna fila de la tabla de Categoría o Parámetros. Si este es el caso, todo lo que tiene que hacer es eliminar de la tabla de parámetros, y MySQL se encargará del resto por usted. –

+0

En realidad, la restricción FK en mi tabla de unión evita que se eliminen las filas de la tabla padre (Parámetro) si se hace referencia a ellas por la tabla de unión. Puedo cambiar esta restricción en el esquema db, pero quería hacer eso usando la anotación de Doctrine (para poder generar un esquema completo desde el código sin ajustar manualmente la base de datos). – JohnM2

+0

¿Le importaría publicar el esquema? Estoy interesado en ver si el manejo de FK se hace en la capa de aplicación a través de Doctrine, o si Doctrine simplemente está abstrayendo lo que MySQL hace. –

Respuesta

28

Para establecer cascada en el nivel de la doctrina:

@ORM\ManyToMany(targetEntity="Target", inversedBy="inverse", cascade={"remove", "persist"}) 

Más información: Doctrine2 Annotation Reference.

Para establecer cascada en el nivel de MySQL:

@ORM\JoinColumn(onDelete="CASCADE", onUpdate="CASCADE") 
+0

Simplemente curioso, pero ¿no podría simplemente eliminar las filas de la tabla de parámetros, y con el FK a la tabla de unión, las filas de unión también se eliminarán? Aún no me he adentrado en D2, pero parece innecesario que el ORM haga lo que hace la base de datos de forma nativa. –

+2

@Inori cascade = {"remove", "persist"} no afecta el esquema de la base de datos, entra en juego cuando elimina entidades usando EntityManager. – JohnM2

+0

@Digital Precision de forma predeterminada La restricción FK no permite eliminar filas de la tabla padre (Parameter) si se hace referencia a ellas mediante join-table. Por eso pregunté cómo puedo cambiar esta restricción para eliminar en cascada. – JohnM2

Cuestiones relacionadas