2013-04-24 20 views
8

ho due entitàORM Doctrine ManyToOne aggiornata CASCADE (Symfony)

class Promotor 
{ 

/** 
* @ORM\ManyToOne(targetEntity="Ciudad", inversedBy="promotor") 
* @ORM\JoinColumn(name="ciudad_id", referencedColumnName="id", nullable=false) 
*/ 
protected $ciudad; 

e

class Ciudad 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @var string 
* 
* @ORM\Column(name="nombre", type="string", length=50) 
*/ 
private $nombre; 

A "Promotor" può vivere in uno "Ciudad" (City). E in una "Ciudad" (Città) può vivere molti "Promotori".

se aggiungo onDelete = "a cascata" in JoinColumn

/** 
* @ORM\ManyToOne(targetEntity="Ciudad", inversedBy="promotor") 
* @ORM\JoinColumn(name="ciudad_id", referencedColumnName="id", nullable=false, onDelete="CASCADE") 
*/ 
protected $ciudad; 

è generare il codice successivo

ALTER TABLE promotor DROP FOREIGN KEY FK_BF20A37FE8608214; 
ALTER TABLE promotor ADD CONSTRAINT FK_BF20A37FE8608214 FOREIGN KEY (ciudad_id) 
REFERENCES Ciudad (id) ON DELETE CASCADE 

ma anche mi piace fare CASCADE aggiornata. Provo con onUpdate = "a cascata", ma doesn' lavoro

[Doctrine\Common\Annotations\AnnotationException] 
[Creation Error] The annotation @ORM\JoinColumn declared on property  Web\PromotorBundle\Entity\Promotor::$ciudad does not have a property named 
"onUpdate". Available properties: name, referencedColumnName, unique, nulla 
ble, onDelete, columnDefinition, fieldName 

dall'errore ho capito che la proprietà onUpdate non esiste, ma .. C'è un modo per fare cascata su aggiornamento?

+1

ho trovato questa nota nella documentazione della dottrina, ma non capisco. Non è più necessario controllare la cascata durante l'aggiornamento. In teoria non cambierà mai gli id ​​ http://www.doctrine-project.org/jira/browse/DDC-725?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel – JGrinon

risposta

9

onDelete = "CASCADE" viene utilizzato a livello di database. Come hai già detto, non c'è nessun aggiornamento. Un altro lato negativo è che ON DELETE CASCADE funziona solo su InnoDB. Non funziona su MyISAM.

Ma si può usare Doctrine in memoria operazioni a cascata:

class Promotor 
{ 

/** 
* @ORM\ManyToOne(targetEntity="Ciudad", inversedBy="promotor", cascade={"persist", "remove"}) 
* @ORM\JoinColumn(name="ciudad_id", referencedColumnName="id", nullable=false) 
*/ 
protected $ciudad; 

E 'tutto descritte nella documentazione: http://docs.doctrine-project.org/en/latest/reference/working-with-associations.html#transitive-persistence-cascade-operations

più si può saltare la JoinColumn annotazioni, perché il modo in cui lo avete scritto, è la configurazione di default e viene generato implicitamente.

Così si può solo scrivere:

class Promotor 
{ 

/** 
* @ORM\ManyToOne(targetEntity="Ciudad", inversedBy="promotor", cascade={"persist", "remove"}) 
*/ 
protected $ciudad; 
+0

BTW, come mai c'è 'inversedBy =" promotore "' sulla proprietà '$ ciudad', se l'entità' Ciudad' NON ha campo '$ promotore'? (E anche dalla natura delle relazioni MTO, non può avere un riferimento "inverso" a "Promotore")? –

+0

Hai ragione, non esiste una proprietà 'promotor' sull'entità' Ciudad'. Quindi non può esserci 'inversedBy =" promotore "'. Ma ti sbagli sulla relazione ManyToOne e sul riferimento "inverso". ManyToOne ha 'inverso' e OneToMany ha' mappedBy'. – alsar

+0

Siamo spiacenti, la mia formulazione non è stata sufficientemente precisa. Quando ho detto 'inverso', in realtà intendevo lo stesso 'inversedBy'. Anche se sembra logico quello che hai detto (che non ci può essere 'inversedBy =" promotore "') Ho cercato i documenti per '@ ManyToOne' http://doctrine-orm.readthedocs.org/en/latest /reference/annotations-reference.html#annref-manytoone e menziona questo parametro 'inversedBy' (sebbene non obbligatorio). Ma sono ancora confuso da - come mai una relazione MTO potrebbe avere "inversedBy'? Non è vero che, potrebbe esserci stato 'inversedBy' che sarebbe stata una relazione ManyToMany? –

Problemi correlati