Bonjour
Voila mon souci:
je dois inclure un fichier xml dans une base de donnes postgresql
un dossier possede de 1 à n situations
une situation possede de 1 à n calcul_culture
dans le xml dossier possede 2 situations
<dossier>
<situation1>
.......
<situation2>
.........
</dossier>
--------------------------------------------------------------------------
<code type="php">
classe dossier
....
/**
* @ORM\OneToMany(targetEntity ="Pertazote\BaseBundle\Entity\Situation", mappedBy="dossier")
*/
protected $situations;
...
public function hydrateSortieXML($dossier, $em) {
for ($i = 0, $size = sizeof($this->situations); $i < $size; ++$i) {
$xml = new \DOMDocument();
/**
* tester existence du fichier situation
* ajout JPF le 30/10/2013
*/
$test_fichier = $dossier . $this->situations[$i]->getNom();
if (file_exists ($test_fichier)) {
$xml->load($dossier . $this->situations[$i]->getNom());
$root = $xml->getElementsByTagName('SITUATION')->item(0);
$situation = $this->situations[$i];
$situation->hydrateSortieXML($root);
$situation->setDossier($this);
$em->merge($situation);
}
}
}
< /code>
--------------------------------------------------------------------------
<code type="php">
classe situation
...
/**
* @ORM\ManyToOne(targetEntity="Pertazote\BaseBundle\Entity\Dossier", inversedBy="situations",cascade={"merge"})
*/
protected $dossier;
/**
* @ORM\OneToMany(targetEntity="Pertazote\BaseBundle\Entity\CalculCulture", mappedBy="situation", cascade={"merge"})
*/
protected $calculsCultures;
...
public function hydrateSortieXML($node) {
$this->hydrateCalculCutlureFromNode($node->getElementsByTagName('RENDEMENT_C'));
$jours = $node->getElementsByTagName('JOUR');
$dateReference = new \DateTime($this->switchDate($jours->item(0)->getElementsByTagName('DATE')->item(0)->attributes->getNamedItem('v')->nodeValue));
$numeroJour = $this->getNombreJourSuivant($dateReference);
while ($jour = $jours->item($numeroJour)) {
$trimestre = new Trimestre();
$trimestre->hydrateSortieXML($jour);
$this->trimestres[] = $trimestre;
$dateReference = $jour->getElementsByTagName('DATE')->item(0);
$dateReference = new \DateTime($this->switchDate($dateReference->attributes->getNamedItem('v')->nodeValue));
$numeroJour += $this->getNombreJourSuivant($dateReference);
}
}
< /code>
--------------------------------------------------------------------------
le handler: importationhandler
<code type="php">
private function onSuccess($fichier) {
$this->archive->unzip($fichier);
$xml = new \DOMDocument();
$xml->load($this->container->getParameter('dossierArchives') . "/extract/" . $fichier->getNom() . "/" . "dossierEntree.txt");
$root = $xml->getElementsByTagName('DOSSIER')->item(0);
$dossier = new Dossier();
$dossier->hydrateEntreeXML($root, $fichier);
$this->em->merge($dossier);
$dossier->hydrateSortieXML($this->container->getParameter('dossierArchives') . "/extract/" . $fichier->getNom() . "/", $this->em);
$this->em->flush();
}
< /code>
--------------------------------------------------------------------------
Le probleme est le suivant symfony me cree 2 lignes dans la table dossier et 2 lignes dans la table situations alors que logiquement je ne veux qu'une ligne dans dossier avec 2 lignes dans situations avec comme cle etrangere l'id du dossier créé.
Merci d'avance
JEan-Philippe
Partager