Bonjour,
Voici le problème sur lequel je m'interroge.
J'ai une table (entitie) contact et une email
Une fiche contact peut contenir plusieurs emails et chaque email est propre à chaque fiche contact (on saisira les emails depuis la fiche contact).
J'utilise donc un Many-To-One avec email qui est propriétaire de contact. (j'ai donc un joli email_id dans ma table contact)
(je pense que jusque là c'est bon)
ensuite je veux typer les emails, genre : professionnel/personnel
Je ne vois pas trop comment rajouter cet élément, sauf directement comme un champ OneToMany avec email comme propriétaire.
merci de vos conseils
Je pense que tu as inversé les choses, contact est le propriétaire des emails, donc tu devrais avoir une colonne contact_id dans ta table email. (car ta table email peut comporter plusieurs email liés a un même contac)
Chaque entité email aura donc comme propriétés :
id
adresse_mail
type (pro/part)
contact (manytoone vers ton entité contact)
Merci bkk0
Mais si je me réfère aux docs, email est l'entité propriétaire car c'est elle qui contient la colonne référence.
je fais donc un ManyToOne vers contact dans l'entity email.
cela me créé la colonne contact_id dans la table email.
jusque là c'est bon.
par contre comment include la possibilité de saisir x emails depuis le formulaire de contact ?
merci
Il faut faire une collection de formulaire (tu peux aller voir un peu plus loin dans les posts, j'avais posté un problème qui a été résolu à ce sujet)
io, ça ressemble à un troll ce post ? :D
bkk0 a à moitié raison, et tu l'as écrit toi même dans le titre de ton topic :
"relation manyToOne, 1 contact X mail" le many c'est ton X mail et le One c'est ton Contact
1 contact A many mail
Donc ton entity mail : manyToOne
Ton entity Contact : oneToMany
L'entité propriétaire est comme tu le dis mail, elle contient la relation, la clef "id contact" ( on parle de propriété dans le contexte database, sur les relations, pas sur l'action comme bkk0 le pensait )
Merci Elium, mais non ce n'est pas un troll :)
dans Email j'ai un ManyToOne avec un inversedBy emails
et dans contact un OneToMany avec mappedBy contact
je pense que les relations sont ok (car dans la bdd c'est bon).
le soucis est dans le formulaire contact ou je souhaite pouvoir saisir directement les x emails
dans le __construct de contact j'ai
$this->emails = new ArrayCollection();
et
public function addEmail(Email $email)
{
$this->emails[] = $email;
}
public function removeEmail(Email $email) {
$this->emails->removeElement($email); }
public function getEmails()
{ return $this->emails; }
et dans le EmailType
$builder->add('emails', CollectionType::class, array (
'entry_type' => EmailType::class,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false
));
mais ça ne fonctionne pas ....
bref je cherche un tuto ou un exemple pour ce type de cas.
merci
Ok, pas de soucis j'étais le premier à avoir du mal avec les relations :) c'est pas forcément si évident au début, tkt ça va venir tout seul et te paraître super easy après !
Voici, un exemple en supposant que tu ton bundle soit AppBundle
/**
* Add email
*
* @param \AppBundle\Entity\Email $email
*
* @return Contact
*/
public function addEmail(\AppBundle\Entity\Email $email)
{
$this->emails[] = $email;
$email->setContact($this);
return $this;
}
Sinon, au niveau des tutos, tu en as de partout,
par exemple , je te conseil absolument de lire et de tester
http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/association-mapping.html
ou encore
https://openclassrooms.com/courses/developpez-votre-site-web-avec-le-framework-symfony2/les-relations-entre-entites-avec-doctrine2
je te conseil de lire tout le chapitre sur doctrine
et évidemment :
http://symfony.com/doc/current/cookbook/form
en particulier :
http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html
ET
http://symfony.com/doc/current/cookbook/form/form_collections.html
Ok merci j'ai essayé en rajoutant dans addEmail :
$email->setContact($this);
mais c'est pareil.
donc mon ContactType j'ai :
$builder->add('emails', CollectionType::class, array (
'entry_type' => EmailType::class,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false
));
cela me créé deux fois les champs dans mon edition.twig et en enregistrant j'ai le retour
This value is not valid.
et dans le debug :
Symfony\Component\Validator\ConstraintViolation
Object(Symfony\Component\Form\Form).children[emails].children[0] = marine@test.com
Caused by:
Symfony\Component\Form\Exception\TransformationFailedException
Compound forms expect an array or NULL on submission.
je continue à tester et à voir les docs...
Bon ça avance j'ai résolu le bug, j'avais dans mon EmailType un autre champ que je n'exploitais pas et c'est celui là qui me retournait l'erreur.
il me reste à gérer la suppression maintenant.
apparemment il faut coder à la main la suppression dans le manyToone
Doctrine: Ensuring the database persistence
When removing objects in this way, you may need to do a little bit more work to ensure that the relationship between the Task and the removed Tag is properly removed.
In Doctrine, you have two sides of the relationship: the owning side and the inverse side. Normally in this case you'll have a many-to-many relationship and the deleted tags will disappear and persist correctly (adding new tags also works effortlessly).
But if you have a one-to-many relationship or a many-to-many relationship with a mappedBy on the Task entity (meaning Task is the "inverse" side), you'll need to do more work for the removed tags to persist correctly.
In this case, you can modify the controller to remove the relationship on the removed tag. This assumes that you have some editAction which is handling the "update" of your Task: