web-dev-qa-db-fra.com

Comment supprimer des lignes de la table de jointure (ManyToMany) dans Doctrine?

J'ai une table de jointure créée en utilisant @ORM\ManyToMany annotation dans Symfony2/Doctrine. Il rejoint les tables Category et Parameter.

Maintenant, je veux supprimer tous les paramètres de la table des paramètres. Parce qu'il y a des contraintes de clé étrangère définies sur la table de jointure, je ne peux pas simplement supprimer des lignes de la table des paramètres. Je dois d'abord supprimer les lignes enfants de la table de jointure. Mais la syntaxe DQL de Dotrine nécessite de donner un nom à l'entité, comme:

DELETE Project\Entity\EntityName

Mais quel est le nom de l'entité de table de jointure générée en utilisant l'association ManyToMany? Comment y faire face?

Sinon, comment puis-je définir ON UPDATE CASCADE et ON DELETE CASCADE sur les contraintes de clé étrangère dans la table de jointure définie par @ORM\ManyToMany annotation.

MODIFIER:

schéma de table de jointure:

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 et on DELETE par défaut sont définis sur RESTRICT

LA SOLUTION FINALE SERAIT:

 * @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")}) 
29
Dawid Ohia

Pour définir la cascade sur le niveau doctrine:

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

Plus d'informations: Référence d'annotation Doctrine2 .

Pour définir la cascade au niveau mysql:

@ORM\JoinColumn(onDelete="CASCADE", onUpdate="CASCADE")
30
Inoryy