IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Concaténer des arrayCollection [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut Concaténer des arrayCollection
    Bonjour,

    Dans une boucle, je cherche à concaténer des collections de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $communes = $obj->getCommunes();
     
    $localites = "";
     
    foreach ($communes->toArray() as $com)
       {
          $localites->AddItem($com->getLocalites());        
       }
    Cependant, j'obtiens l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Call to a member function AddItem() on a non-object in...
    Quelqu'un aurait une idée sur la manière de procéder pour pouvoir merger ces différents arrayCollection?

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    pas besoin de faire un toArray

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut
    Bonjour et merci pour ton intervention. Du fait que $obj->getCommunes() retourne une collection, je devais employer le toArray().

    Je viens de trouver la solution que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
        if($typeElemInit == 'commune')
         {
          $localites = $obj->getLocalites();      
         }
        else
         {      
          $communes = $obj->getCommunes();
     
          $localites = new ArrayCollection();
     
          foreach ($communes->toArray() as $com)
           {
            foreach ($com->getLocalites()->toArray() as $locByCom)
             {
              $localites->add($locByCom);
             }        
           }
         }
     
        $retour = "";
     
        foreach ($localites->toArray() as $loc)
         {
          $retour .= $loc->getId() . '_' . $loc->getNom() . '+';
         }
     
        //Supprimer le dernier '+'
        if($retour != "")
          {
           $retour = substr($retour, 0, strlen($retour) - 1);
          }         
     
        //return new \Symfony\Component\HttpFoundation\Response($retour);
        return $retour;
    .

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Collection c'est un ArrayAccess, donc direct foreach dessus ...
    tu te compliques et tu bouffes de le mémoire pour rien la

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut
    OK et merci pour tes bons conseils. Voici donc ma méthode ré-écrite dans le repository :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     public function getLocalitesByElem($idElemInit, $typeElemInit)
    	{	
    		$em = $this->getEntityManager();
     
        switch($typeElemInit)
         {
          case 'commune':
            $obj = $em->getRepository('HotelsGestionAnnoncesBundle:Commune')->find($request->get('idElemInit'));
          break;
     
          case 'province':
            $obj = $em->getRepository('HotelsGestionAnnoncesBundle:Province')->find($request->get('idElemInit'));
          break;
     
          case 'departement':
            $obj = $em->getRepository('HotelsGestionAnnoncesBundle:Departement')->find($request->get('idElemInit'));
          break;
     
          case 'region':
           $obj = $em->getRepository('HotelsGestionAnnoncesBundle:Region')->find($idElemInit);
          break;
     
          default:
            $obj = $em->getRepository('HotelsGestionAnnoncesBundle:Pays')->find($request->get('idElemInit'));
          break;
         }
     
        if($typeElemInit == 'commune')
         {
          $localites = $obj->getLocalites();      
         }
        else
         {      
          $communes = $obj->getCommunes();
     
          $localites = array();
     
          foreach ($communes as $com)
           {
            foreach ($com->getLocalites() as $locByCom)
             {
              $localites[] = $locByCom;
             }        
           }
         }
     
        return $localites;
    	}
    J'y fais appel de cette manière dans un formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                ->add('localite','entity', array('class'=>'Hotels\GestionAnnoncesBundle\Entity\Localite',
                                                 'query_builder' => function(LocaliteRepository $er) use ($region)
                                                                      {
                                                                       return $er->getLocalitesByElem($region->getId(), 'region');
                                                                      }, 
                                                 'required' => false))
            ;
    Cependant, j'obtiens l'erreur :

    Expected argument of type "Doctrine\ORM\QueryBuilder", "array" given

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 135
    Points : 153
    Points
    153
    Par défaut
    tu retourne un array alors qu'il attend un queryBuilder...

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 135
    Points : 153
    Points
    153
    Par défaut
    au lieu de retourner un tableau car si j'ai bien compris ton code tu veux retourner qu'une colonne de ta table. Utilise les requetes doctrine! utilise partial si tu veux retourner qu'une seul colonne

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut
    Merci beaucoup de l'intérêt que tu portes à mon problème.

    La méthode getLocalitesByElem() me retourne un tableau d'objets car elle peut-être appelée dans différentes situations (pas uniquement depuis un formulaire).

    Y a-t-il donc une possibbilité d'affecter un tableau d'objets à un champ de type 'entity' (en ne passant donc pas par array( 'query_builder' => ...)?

  9. #9
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 135
    Points : 153
    Points
    153
    Par défaut
    au lieu de mettre query_builder tu peux rajouter ce champs
    'choices'=>ton_tableau_d'objets !

  10. #10
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut
    Merci beaucoup pour ton aide. Je venais juste de tenter cette solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                ->add('localite','entity', array('class'=>'Hotels\GestionAnnoncesBundle\Entity\Localite',
                                                 'choices' => function(LocaliteRepository $er) use ($region)
                                                                      {
                                                                       return $er->getLocalitesByElem($region->getId(), 'region');
                                                                      }, 
                                                 'required' => false))
    Cependant, j'obtiens l'erreur suivante :

    Catchable Fatal Error: Argument 1 passed to Hotels\GestionAnnoncesBundle\Form\{closure}() must be an instance of Hotels\GestionAnnoncesBundle\Entity\LocaliteRepository, none given in C:\wamp\www\Symfony\src\Hotels\GestionAnnoncesBundle\Form\AdresseType.php line 23
    Or, j'ai bien ceci au début de mon formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    use Hotels\GestionAnnoncesBundle\Entity\LocaliteRepository;

  11. #11
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 135
    Points : 153
    Points
    153
    Par défaut
    franchement je n'ai jamais fait sa! donc je peux pas t'aider sur cette erreur par contre localite est dans ton Form AdresseType c'est bien?? Moi je te conseil d'appeler la fonction dans ton contrôleur et de passer le tableau en paramètre afin d'éviter d'appeler ton fonction N fois la génération d'adresse. De plus pour ton fichier LocaliteRepository je n'utiliserai pas le foreach alors que tu peux faire autrement !! tu prends des ressources pour rien... enfin j'espère que sa t'aidera!! Mais essaie de passer le tableau en paramètre !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL] Concaténer des requêtes SQL en PHP
    Par brotelle dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 18/04/2006, 19h53
  2. Réponses: 4
    Dernier message: 17/04/2006, 20h10
  3. Réponses: 1
    Dernier message: 30/12/2005, 10h57
  4. [débutant] concaténer des champs.
    Par goony dans le forum Langage SQL
    Réponses: 15
    Dernier message: 25/08/2005, 08h28
  5. Concaténer des lignes d'enregistrements dans une colonne
    Par dany13 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 08/07/2005, 21h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo