2011-12-30 27 views
27

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

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. –

+0

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

+0

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à. –

risposta

28

Per impostare a cascata a livello dottrina:

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

Maggiori informazioni: Doctrine2 Annotation Reference.

Per impostare a cascata a livello mysql:

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

Solo curioso, ma non poteva semplicemente cancellare le righe dalla tabella Parametro e con l'FK alla tabella di join, anche le righe di join verranno eliminate? Non ho ancora approfondito D2, ma non sembra necessario che l'ORM faccia ciò che il database fa in modo nativo. –

+2

@Inori cascade = {"remove", "persist"} non influenza lo schema del database, entra in gioco quando si rimuovono entità utilizzando EntityManager. – JohnM2

+0

@Digital La precisione per impostazione predefinita del vincolo FK non consente di eliminare righe dalla tabella padre (Parametro) se sono indicate da join-table. Questo è il motivo per cui ho chiesto come posso modificare questo vincolo per eliminare a cascata. – JohnM2

Problemi correlati