Per avere Dottrina gestire automaticamente la persistenza della vostra proprietà User#comments
è necessario impostare a cascata per l'operazione "persistono".
La cascata (persistono, rimuovere, unire, tutti) opzione offre la possibilità di ommit ...
$em->persist($myFirstComment);
... se lo si imposta correttamente sul lato inverso di una relazione bidirezionale, per esempio . Si può anche rimuovere automaticamente User#comments
se si rimuove un'entità Utente con cascata "rimuovi"!
esempio:
/**
* Bidirectional - One-To-Many (INVERSE SIDE)
*
* @OneToMany(targetEntity="Comment", mappedBy="author", cascade={"persist", "remove"})
*/
private $comments;
Per saperne di più sulla mappatura Association e cascata nel Transistive Persistence/Cascade Options capitolo della documentazione.
Si ricorda:
Dottrina controllerà solo il lato possedere di un'associazione per le modifiche.
Le modifiche apportate solo al lato inverso di un'associazione vengono ignorate. Assicurati di aggiornare entrambi i lati di un'associazione bidirezionale (o almeno il lato possessore, dal punto di vista della dottrina)
- associazioni OneToMany non sono mai dalla parte proprietaria.
- La parte inversa deve utilizzare l'attributo
mappedBy
della dichiarazione di mapping OneToOne, OneToMany o ManyToMany. L'attributo mappedBy
contiene il nome del campo di associazione sul lato proprietario
- Il lato proprietario deve utilizzare l'attributo
inversedBy
della dichiarazione di mapping OneToOne, ManyToOne o ManyToMany. L'attributo inversedBy
contiene il nome del campo di associazione sul lato opposto.
- ManyToOne è sempre il lato proprietario di un'associazione bidirezionale.
- OneToMany è sempre il lato inverso di un'associazione bidirezionale.
Inoltre:
devi solo chiamare persistere se si crea una nuova entità di radice (cioè $user = new User()
) che non è già riuscito dalla dottrina (e non dovete chiamare persistono sul $myFirstComment
nella vostra esempio se hai impostato correttamente l'opzione cascade).
Altrimenti è sufficiente chiamare a filo se l'entità non è stata rimossa per qualche motivo.
Ho un'altra parola, perché devo chiamare il riferimento ad un'altra entità se ho una cascata? –
Per farla breve: Se ho un'associazione da un'entità all'altra devo chiamare sempre quell'altra entità su inserti/aggiornamenti. Non posso dire $ user-> addComment ("qualche commento"), devo chiamare la relazione e quindi fare $ user-> addComment ("qualche commento"). Questo ha senso, ma è un po 'stupido. Cosa succede se ho 50 relazioni? Per chiamare ogni relazione su insert/update? Doctrine è ottimo per selezionare ma fa schifo per tutto il resto se si hanno relazioni. Devo fare 50 volte $ this-> em-> getReference ('nome entità') ..... –
Ho risposto alla tua domanda con molte spiegazioni e il suggerimento alla documentazione + allegato un codice exmaple. per favore accetta la risposta se ti ha aiutato :) – nifr