Ho una tabella di join creata utilizzando l'annotazione @ORM\ManyToMany
in Symfony2/Doctrine. Si unisce alla tabella Category
e Parameter
.Come eliminare righe da join-table (ManyToMany) in Doctrine?
Ora voglio cancellare tutti i parametri dalla tabella Parametri. Poiché ci sono vincoli di chiave esterna definiti nella tabella di join, non posso semplicemente eliminare le righe dalla tabella dei parametri. Per prima cosa devo cancellare le righe figlio da join-table. Ma la sintassi DQL di Dotrine richiede di dare un nome dell'entità, come:
DELETE Project\Entity\EntityName
Ma qual è il nome dell'entità join-tabella generata utilizzando associazione ManyToMany? Come affrontarlo?
In alternativa, come è possibile impostare ON UPDATE CASCADE e ON DELETE CASCADE sui vincoli di chiave esterna nella tabella di join definita dall'annotazione @ORM\ManyToMany
.
EDIT:
schema di join-tavolo:
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
e on DELETE
di default sono impostate per RESTRICT
la soluzione finale potrebbe essere:
* @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")})
puoi pubblicare lo schema della tabella? Ho il sospetto che tu abbia un vincolo FK sulla tabella di join per rimuovere le righe se qualsiasi riga viene rimossa dalla tabella Category o Parameter. Se questo è il caso, tutto ciò che devi fare è eliminare dalla tabella dei parametri, e MySQL si occuperà del resto per te. –
In realtà il vincolo FK nella mia tabella di join impedisce l'eliminazione di righe dalla tabella padre (Parametro) se sono indicate da join-table. Posso modificare questo vincolo nello schema db, ma volevo farlo usando l'annotazione di Doctrine (per essere in grado di generare uno schema completo dal codice senza modificare manualmente il database). – JohnM2
Ti dispiacerebbe postare lo schema? Sono interessato a vedere se la gestione FK è fatta a livello di app tramite Doctrine, o se Doctrine sta solo astrattamente ciò che MySQL fa già. –