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")})
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")