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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    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
    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 confirmé

    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
    Par défaut
    pas besoin de faire un toArray

  3. #3
    Membre éprouvé
    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
    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 confirmé

    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
    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 éprouvé
    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
    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 confirmé
    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
    Par défaut
    tu retourne un array alors qu'il attend un queryBuilder...

+ 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