Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
J'ai 3 entités ConfigFields <- ConfigMapping <- ConfigMappingAttributes
Une ConfigFields possède une collection de ConfigMapping au niveau du formulaire cela donne la possibilité d'ajouter autant de mapping que voulu.
Chaque mapping possède des attributs ici aussi géré dans une autre collection.
Lors du submit de mon formulaire, mes données s'enregistrent en base à tous les niveaux.
ConfigMapping avait besoin des méthodes AddMappings et RemoveMappings pour ajouter correctement les mappings correspondant à la configuration. Une erreur était lancé si les méthode n'existait pas : conformément à ce code :
https://github.com/doctrine/DoctrineMod … yValue.php
Toutefois j'espérais, et j'avais besoin que ce soit aussi le cas pour la collection ConfigMappingAttributes et même si mon cascade ={"persist"} enregistre les données en base, la clé étrangère de ConfigMapping dans ConfigMappingAttributes ne s'insère pas, et je n'arrive pas à comprendre pourquoi. Les méthodes AddAttributes et removeAttributes ne sont pas demandés comme s'il n'en avait pas besoin, pourtant aucune différence n'existe dans le code entre la première collection et la seconde.
EDIT: Si je renseigne la clé étrangère dans ConfigMappingAttributes a la main dans la table, au niveau du formulaire, les données seront bien "bind" et donc on s'y retrouve, mais l'automatiser dans le code semble plus compliqué...
ConfigFields
[lang=php] public function __construct() { $this->mappings = new ArrayCollection(); } /** * Référence les mapping d'une config * @ORM\OneToMany(targetEntity="ConfigMapping", mappedBy="configFields", cascade={"persist"}) */ protected $mappings; /** * Méthode permettant d'ajouter un mapping a une configuration * @param ConfigMapping $mapping notre mapping a ajouter */ public function addMapping(ConfigMapping $mapping) { $mapping->setConfigFields($this); $this->mappings[] = $mapping; } /** * Méthode permettant de parser une collection afin d'ajouter chaque mapping à la configuration actuelle * @param ArrayCollection $mappings nos mappings */ public function addMappings(ArrayCollection $mappings) { foreach ($mappings as $mapping) { $this->addMapping($mapping); } }
Config mapping possède donc une foreign key de ConfigFields et une collection d'attributs
J'ai rajouté la méthode add mais qui n'est jamais appelée
[lang=php] public function __construct() { $this->attributes = new ArrayCollection(); } /** * Clé étrangère de la table configFields * @var int|null * @ORM\ManyToOne(targetEntity="ConfigFields", inversedBy="mappings") * @ORM\JoinColumn(name="configFields", referencedColumnName="idConfigFields", onDelete="CASCADE") */ protected $configFields; /** * @ORM\OneToMany(targetEntity="ConfigMappingAttributes", mappedBy="idMapping", cascade={"persist"}) */ protected $attributes; /** * Méthode permettant d'ajouter un attribut à une configuration */ public function addAttribute(ConfigMappingAttributes $attribute) { var_dump($attribute);exit; $attribute->setIdMapAttr($this); $this->attributes[] = $attribute; } public function addAttributes(ArrayCollection $attributes) { foreach ($attributes as $attribute) { $this->addAttribute($attribute); } }
Et la dernier entité, possède une clé étrangère de configMapping, mais qui malheureusement lors du persist ne se renseigne pas...
[lang=php] /** * @var int|null * @ORM\ManyToOne(targetEntity="ConfigMapping", inversedBy="attributes") * @ORM\JoinColumn(name="idMapping", referencedColumnName="idMapping", onDelete="CASCADE") */ protected $idMapping;
N'hésitez pas à me demander plus d'infos si nécéssaire, à bientôt !
Dernière modification par JGreco (13-02-2015 12:08:27)
Hors ligne
J'ai avancé un peu dans mon problème, l'insert se fait à présent correctement grâce à un petit bout de code trouvé ici : http://symfony.com/fr/doc/current/cookb … tions.html
Donc maintenant, j'ai testé l'update ou l'insert, et là même soucis, rien ne se fait. Je ne comprends pas pourquoi... le persist ne persist pas les collections, mais mes champs principaux sont bien mis à jour. j'ai vérifié le form->getData, mes collections sont bien avec les data à mettre à jour.
EDIT: Après avoir debugué mon script je me suis rendu compte que le persist fonctionne bien mais le flush non, en fait je faisait un flush avec un paramètre qui était mon entité config, et quand on ne donne pas de paramètres il fait bien le flush sur tout ce qu'il y a dans le persist, et mes collection était correctement persisté, donc l'insert et l'update marche mieux.
Mais toujours aucun indice sur la suppression.
Dernière modification par JGreco (09-02-2015 11:07:45)
Hors ligne
Pages: 1