logo Homepage
+  NewbieContest
|-+  Programmation» Langages Web» problème avec doctrine dans symfony.
Username:
Password:
Pages: [1]
  Imprimer  
Auteur Fil de discussion: problème avec doctrine dans symfony.  (Lu 4583 fois)
coolswing
Profil challenge

Classement : 3511/54254

Néophyte
*
Hors ligne Hors ligne
Messages: 9


Voir le profil
« le: 28 Juillet 2014 à 15:51:04 »

Bonjour a tous,

J'ai un problème avec les données renvoyées par une requête pour la génération d'un formulaire.

En détail:

J'ai des Entités nommées AdmParamDonnee correspondant à des pays, risques, sinistres, ... en fonction de leur liste

exemple: les admParamDonnees qui appartiennent a la liste 12 sont tous des pays.

On associe des libelles (autre entité nommée AdmParamDonneeLibelle) à ces admParamDonnees en fonction de la langue et éventuellement du client si il souhaite voir un libelle plus parlant .(dans se cas on crée un nouveau libelle liée au client et a l'entite admparamdonnee).

Voila pour la théorie, en pratique je suis en train de crée un formulaire de clients afin de leurs associée des listes d'admParamDonnees et des admParamDonnees (en fonction des listes sélectionnées).

Mon problème est que ma requêtes pour générer les champs d'admParamDonnee ne me renvois pas les bons libelles associés, je décide donc d'afficher la requête exécuté par Doctrine afin de l'exécuter sur pgadmin et la pgadmin me renvois bien les admParamDonnees associé aux bon libelles ....

mon formbuilder:


    
Code:
public function buildForm(FormBuilderInterface $builder, array $options)
    {
        
        $em = $this->em;
        $user = $this->security->getToken()->getUser();
        $currentUserClientLink = $user->getAdmLienUtilisateurClientCourant();
        $client = $builder->getData();
        $lang = $currentUserClientLink->getSadmLangue();      
        $listeParamListe = $options['listeParamListe'];
        
        $builder
        ->add('nom')
        ->add('chemin')
        ->add('langues',"genemu_jqueryselect2_entity", array(
            "class" => "DeltaRMAdminBundle:SadmLangue",
            'multiple'=> true,
            'required' => false,
            'query_builder' => function (EntityRepository $er) use ($options) {
              return $er->createQueryBuilder('u')
              ->select("u")
              ;
          }, ))
/*
        ->add('admLiensParamDonneeClient', "genemu_jqueryselect2_entity", array(
            "class" => "DeltaRMAdminBundle:admLienParamDonneeClient",
            'multiple'      => true,
            'required' => false
          )
        )*/
        ->add('filtres', "genemu_jqueryselect2_entity", array(
            "class" => "DeltaRMAdminBundle:sadmStructureAttribut",
            'multiple'=> true,
            'required' => false,
            'query_builder' => function (EntityRepository $er) use ($options) {
              return $er->createQueryBuilder('u')
              ->select("u")
              ->andWhere('u.type = :type')
              ->setParameter('type', "FILTRE")
              ;
          }, )
        )
        ->add('affichages', "genemu_jqueryselect2_entity", array(
            "class" => "DeltaRMAdminBundle:sadmStructureAttribut",
            'multiple'=> true,
            'required' => false,
            'query_builder' => function (EntityRepository $er) use ($options) {
              return $er->createQueryBuilder('u')
              ->select("u")
              ->andWhere('u.type = :type')
              ->setParameter('type', "AFFICH")
              ;
          }, )
        )
        ->add('admParamListes','genemu_jqueryselect2_entity', array(
            "class" => "DeltaRMAdminBundle:AdmParamListe",
            'multiple'=> true,
            'required' => false,
            'query_builder' => function (EntityRepository $er) use ($options) {            
              return $er->createQueryBuilder('u')
              ->select('u, ul')
              ->leftJoin('u.admParamListeLibelles', "ul")
              ->andWhere('u.supDate IS NULL')
              ->andWhere('u.reference IS NULL')
              ->andWhere('ul.supDate IS NULL')
              ->andwhere('u.id <> 12')
              ->andwhere('u.id <> 21')
              ->andwhere('u.id <> 17')
              ->andwhere('u.id <> 22')
              ->addOrderBy('ul.libelle')            
              ;
          }, ))
        ->add(
            'pays','genemu_jqueryselect2_entity', array(
                'class' => 'DeltaRMAdminBundle:AdmParamDonnee',
                'multiple'=> true,
                'required' => false,
                'query_builder' => $em->getRepository('DeltaRMAdminBundle:AdmParamDonnee')->createQueryBuilderCompleteParamDonnesOfListeId(12, $lang, $client->getId())
            )
        );
        /* génère les champs pour les listes d'admParamDonnees*/
        foreach ($listeParamListe as $paramListe)
        {    
            $id = $paramListe->getId();
            $name = $paramListe->getCurrentAdmParamListeLibelle()->getLibelle();
            
            $builder->add(
                'listeParam'.$id,'genemu_jqueryselect2_entity', array(
                    'class' => 'DeltaRMAdminBundle:AdmParamDonnee',
                    'multiple'=> true,
                    'required' => false,
                    'query_builder' => $em->getRepository('DeltaRMAdminBundle:AdmParamDonnee')->createQueryBuilderCompleteParamDonnesOfListeId($id, $lang, $client->getId()),
                    'attr' => array('data-id' => $id,
                                    'data-name' => $name)
                ));          
        }
    }



voici la méthode exécutée pour la requête:


Code:
public function createQueryBuilderParamDonnesOfListeId($listeId, $sadmLangue, $client)
    {
        if (!$client)
            throw new \Exception("*Erreur client non definit pour la fonction createQueryBuilderParamDonnesOfListeId*");
        $queryBuilder = $this->getEntityManager()
            ->createQueryBuilder();
        $queryBuilder
            ->select('prm_don, pdl, apdlc')
            ->from('DeltaRMAdminBundle:AdmParamDonnee', 'prm_don')
            ->leftJoin("prm_don.admParamDonneeLibelles", "pdl", "WITH", "pdl.supDate is NULL and pdl.reference is NULL and pdl.sadmLangue = :sadmLangue and pdl.sadmClient = :client")
            ->leftJoin("prm_don.admLienParamDonneeClients", "apdlc")
            ->where('prm_don.admParamListe = :listeId')
            ->andWhere("prm_don.supDate IS NULL")
            ->andWhere("prm_don.reference IS NULL")
            ->andWhere("apdlc.supDate IS NULL")
            ->andWhere("apdlc.reference IS NULL")
            ->andWhere("apdlc.sadmClient = :client")
            ->setParameter('listeId', $listeId)
            ->setParameter('sadmLangue', $sadmLangue)
            ->setParameter('client', $client)
            ->orderBy('apdlc.ordre')
            ->addOrderBy('pdl.libelle');
        $result = $queryBuilder->getQuery()->getResult();
        
        return $queryBuilder;
    }

Lorsque j'affiche les données récupérées pour la liste 34 (c'est la première liste générée par ma boucle) avec ce code:


Code:
$query = $em->getRepository('DeltaRMAdminBundle:AdmParamDonnee')->createQueryBuilderCompleteParamDonnesOfListeId(34, $lang, $client->getId());
$results = $query->getQuery()->getResult();
foreach($results as $result)
{
    echo 'admParamDonne : <br>';
    var_dump(gettype($result));
    var_dump(get_class($result));
    var_dump('id: '.$result->getId());
    echo 'libelles : <br>';
    foreach($result->getAdmParamDonneeLibelles() as $libelle)
    {
       var_dump(gettype($libelle));
       var_dump('id: '.$libelle->getId());
    }
    echo '-----------------------------------<br>';
}


j'obtiens:


admParamDonne :
string 'object' (length=6)
string 'DeltaRM\AdminBundle\Entity\AdmParamDonnee' (length=41)
string 'id: 519' (length=7)
libelles :
string 'object' (length=6)
string 'id: 24099' (length=9)
string 'object' (length=6)
string 'id: 5115' (length=8)
string 'object' (length=6)
string 'id: 24101' (length=9)
-----------------------------------
admParamDonne :
string 'object' (length=6)
string 'DeltaRM\AdminBundle\Entity\AdmParamDonnee' (length=41)
string 'id: 351' (length=7)
libelles :
-----------------------------------
admParamDonne :
string 'object' (length=6)
string 'DeltaRM\AdminBundle\Entity\AdmParamDonnee' (length=41)
string 'id: 352' (length=7)
libelles :
-----------------------------------
admParamDonne :
string 'object' (length=6)
string 'DeltaRM\AdminBundle\Entity\AdmParamDonnee' (length=41)
string 'id: 354' (length=7)
libelles :
-----------------------------------
admParamDonne :
string 'object' (length=6)
string 'DeltaRM\AdminBundle\Entity\AdmParamDonnee' (length=41)
string 'id: 353' (length=7)
libelles :
-----------------------------------

on vois ici que j'obtiens le libelle d'id 24099 soit un libelle qui possède un id de référencement (qui ne devrai donc pas être la car dans ma requête j'ai 'and pdl.reference is NULL').

lorsque j'exécute pour connaitre la requête exécuté par doctrine:

Code:
echo ''.$query->getQuery()->getSQL().'<br>';
var_dump($query->getQuery()->getParameters());
j'obtiens la requête suivante:


Code:
SELECT a0_.prm_don_id AS prm_don_id0, a0_.prm_don_creat_date AS prm_don_creat_date1, a0_.prm_don_modif_date_deb AS prm_don_modif_date_deb2, a0_.prm_don_modif_date_fin AS prm_don_modif_date_fin3, a0_.prm_don_sup_date AS prm_don_sup_date4, a0_.prm_don_ordre AS prm_don_ordre5, a1_.pdl_id AS pdl_id6, a1_.pdl_creat_date AS pdl_creat_date7, a1_.pdl_modif_date_deb AS pdl_modif_date_deb8, a1_.pdl_modif_date_fin AS pdl_modif_date_fin9, a1_.pdl_sup_date AS pdl_sup_date10, a1_.pdl_libelle AS pdl_libelle11, a2_.lpdc_id AS lpdc_id12, a2_.lpdc_creat_date AS lpdc_creat_date13, a2_.lpdc_modif_date_deb AS lpdc_modif_date_deb14, a2_.lpdc_modif_date_fin AS lpdc_modif_date_fin15, a2_.lpdc_sup_date AS lpdc_sup_date16, a2_.lpdc_ordre AS lpdc_ordre17, a0_.prm_don_creat_utl_id AS prm_don_creat_utl_id18, a0_.prm_don_modif_utl_id AS prm_don_modif_utl_id19, a0_.prm_don_sup_utl_id AS prm_don_sup_utl_id20, a0_.prm_don_id_ref AS prm_don_id_ref21, a0_.prm_don_prm_lst_id AS prm_don_prm_lst_id22, a1_.pdl_creat_utl_id AS pdl_creat_utl_id23, a1_.pdl_modif_utl_id AS pdl_modif_utl_id24, a1_.pdl_sup_utl_id AS pdl_sup_utl_id25, a1_.pdl_id_ref AS pdl_id_ref26, a1_.pdl_prm_don_id AS pdl_prm_don_id27, a1_.pdl_lan_id AS pdl_lan_id28, a1_.pdl_cli_id AS pdl_cli_id29, a2_.lpdc_sup_utl_id AS lpdc_sup_utl_id30, a2_.lpdc_prm_don_id AS lpdc_prm_don_id31, a2_.lpdc_cli_id AS lpdc_cli_id32, a2_.lpdc_creat_utl_id AS lpdc_creat_utl_id33, a2_.lpdc_id_ref AS lpdc_id_ref34, a2_.lpdc_modif_utl_id AS lpdc_modif_utl_id35
 
FROM admin.adm_param_donnee a0_
 
LEFT JOIN admin.adm_param_donnee_libelle a1_ ON a0_.prm_don_id = a1_.pdl_prm_don_id AND (a1_.pdl_sup_date IS NULL AND a1_.pdl_id_ref IS NULL AND (a1_.pdl_cli_id = ? OR a1_.pdl_cli_id IS NULL))
 
LEFT JOIN admin.adm_lien_param_donnee_client a2_ ON a0_.prm_don_id = a2_.lpdc_prm_don_id AND (a2_.lpdc_cli_id = ? AND a2_.lpdc_sup_date IS NULL AND a2_.lpdc_id_ref IS NULL)
 
WHERE a0_.prm_don_prm_lst_id = ? AND a0_.prm_don_sup_date IS NULL AND a0_.prm_don_sup_date IS NULL
 
ORDER BY a1_.pdl_lan_id ASC, a2_.lpdc_ordre ASC, a1_.pdl_libelle ASC

avec les paramètre suivant:

Code:
object(Doctrine\Common\Collections\ArrayCollection)[8347]
  private '_elements' =>
    array (size=2)
      0 =>
        object(Doctrine\ORM\Query\Parameter)[8376]
          private 'name' => string 'listeId' (length=7)
          private 'value' => int 34
          private 'type' => string 'integer' (length=7)
      1 =>
        object(Doctrine\ORM\Query\Parameter)[8377]
          private 'name' => string 'client' (length=6)
          private 'value' => int 2
          private 'type' => string 'integer' (length=7)


et lorsque je l'exécute sur pgAdmin :

imp écran ici:
http://sdz-upload.s3.amazonaws.com/prod/upload/Capture%20d%E2%80%99%C3%A9cran%202014-07-28%20%C3%A0%2017.01.311.png
prm_don_id est l'id des admParamDonnees, pdl_id est l'id des admParamDonneLibelles et pdl_Libelle le texte affiché.


j'ai pour l'admParamDonnée d'id 519:

    -libelle d'id 5072

    -libelle d'id 5115

Qui sont les libelles que j'aimerai afficher.

Si quelqu'un vois ce qui se passe, pourquoi la Doctrine ne me renvois pas les bonnes info alors que  la requête générée fait exactement ce que j'attend, cela pourrai m'éviter une calvitie prématuré du à l'arrachement de mes cheveux....

Si vous voulez plus de code je suis disposé a en mettre.

D'avance merci
« Dernière édition: 28 Juillet 2014 à 17:03:01 par coolswing » Journalisée
Pages: [1]
  Imprimer  
 
Aller à: