Bonjour à tous,
Voila je rencontre un gros problème avec mon code et ce depuis des jours.
Je vais simplifier le problème mais essayez de garder en tête que mon projet est vraiment complexe, c'est un logiciel de comptabilité de copropriétés.
Imaginons que j'ai une entité (Immeuble) lié à une autre (ImmeubleVersion) avec OneToMany. Un Immeuble peut avoir énormément de version, plusieurs centaines.
Voici ce que je fais dans on controller, pour simplifier :
$critere = new ImmeubleCritere();
$critere->immeubleId = 1;
$critere->immeubleVersionId = 1;
$immeuble = $this->get('logiciel_immeuble_repository')->getImmeuble($critere);
dump($immeuble);
$critere = new ImmeubleCritere();
$critere->immeubleId = 1;
$critere->immeubleVersionId = 5;
$immeuble2 = $this->get('logiciel_immeuble_repository')->getImmeuble($critere);
dump($immeuble2);
En MySQL, en gros, il va allé chercher d'abord la version 1 ; puis la version 5. Je vous passe des détails des Critere(), c'est ce qui formalise une requête (le "where" essentiellement). Les requêtes MySQL sont bonnes dans le profiler, elles renvoient bien deux choses différentes. Or, dans mon Controller, vu que ce sont des persistents collections, j'aurais à chaque fois la version 1 lors des deux dump ...
J'aimerais pouvoir allé chercher la version la 1 ET la version 5 via. deux requêtes différentes. Je sais bien qu'il est possible de faire un IN(1,5) en MySQL mais mon problème est bien plus complexe : j'ai mis les deux requêtes dans un même controller mais dans les faits, l'une est un controller, l'autre dans un service inséré par un formulaire lui-même inséré par un controller.
En fait c'est vraiment que Doctrine renvoit PersistentCollection qui pose problème je pense, car dans PhpMyAdmin ça fonctionne.
(Peut-être est-il possible, dans certains cas, de retourner ArrayCollection plutôt que PersistentCollection ? Enfin je ne sais pas trop ce que j'avance la, j'ai vraiment du mal à même imaginer comment résoudre le problème)
Quelqu'un pourrait m'aider ?
Merci d'avance :)
Et si tu convertit tes PersistentCollection en tableau en utilisant la méthode $db->toArray();
Merci de vos réponses :)
Malheureusement pour le $db->toArray(), ça ne peut pas fonctionner puisque si je récupère une donner A dans un premier temps, puis une donnée B, la donnée B me retournera forcément la donnée A (bien que les requêtes soient différentes en MySQL, Symfony retourne la même chose vu que c'est une PersistentCollection).
En ce qui concerne le dump, le voici mais il est vraiment basique :
De la même manière, la méthode getImmeuble est tout ce qu'il y a de plus basique ... un SELECT sur une immeuble, puis une jointure sur une table immeuble_version ; la seule chose qui change, c'est l'ID de la version voulue.
Si quelqu'un peut m'aider ...
Merci d'avance :)
Ton problème, je pense, viens du lazy loading de doctrine. Ce n'est pas les objets que tu réccupères mais des instances de classe PersistentCollection
En gros, ils ne seront chargé que dans le cas ou tu fais un getter sur eux. (ex dans twig, le getter fais appelle à une requete)
Une astuce consiste à ajouter une annotation dans ta relation fetch eager, exemple ci dessous
@ORM\OneToOne(targetEntity="MyEntity" , fetch="EAGER")
Ce cette manière tu forces doctrine a charger les objets et d'oublier le lazy loading sur la relation