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 :

Parcourir tableau d'objets


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2012
    Messages : 24
    Points : 10
    Points
    10
    Par défaut Parcourir tableau d'objets
    Bonjour,

    j'ai quelque soucis a parcourir dans mon template twig un tableau retourné par ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    public function myFindAll()
    {
        $genres = $this->createQueryBuilder('g')
            // leftJoin because I need all the genre
            ->leftJoin('g.films', 'f')
            ->addSelect('COUNT(f)')
            ->groupBy('g.id')
            ->getQuery()
            ->getResult();
     
        // $genres contains all the genres and the associated movies
        return ($genres);
    }
    Je l'appelle dans mon controller et je fais un :

    Qui me génère ceci :

    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
    <?php 
    array (size=5)
      0 => 
        array (size=2)
          0 => 
            object(gstyle39\VideothequeBundle\Entity\Genre)[224]
              private 'id' => int 1
              protected 'films' => 
                object(Doctrine\ORM\PersistentCollection)[219]
                  ...
              protected 'label' => string 'Action' (length=6)
          1 => string '2' (length=1)
      1 => 
        array (size=2)
          0 => 
            object(gstyle39\VideothequeBundle\Entity\Genre)[221]
              private 'id' => int 2
              protected 'films' => 
                object(Doctrine\ORM\PersistentCollection)[230]
                  ...
              protected 'label' => string 'Aventure' (length=8)
          1 => string '1' (length=1)
      2 => 
        array (size=2)
          0 => 
            object(gstyle39\VideothequeBundle\Entity\Genre)[228]
              private 'id' => int 3
              protected 'films' => 
                object(Doctrine\ORM\PersistentCollection)[233]
                  ...
              protected 'label' => string 'Combat' (length=6)
          1 => string '1' (length=1)
    D'habitude je procède avec un for :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <ul>
            {% for genre in genres %}
    		<li>	    
    		    <a href="{{ path('VideothequeBundle_genre', {'id': genre.id}) }}">{{ genre.label }}</a>
                        Nombre de films associés : (ici je veux aussi afficher la valeur du 2ème index de chaque array (exemple : string '2' pour le premier array))
    		</li>
    	{% endfor %}
    </ul>
    Ce qui me renvoie :
    Item "id" for "Array" does not exist in gstyle39VideothequeBundle:Videotheque:s_genres.html.twig at line 7
    Merci d'avance pour vos explications.

  2. #2
    Membre habitué
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Mai 2011
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef d'entreprise
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2011
    Messages : 122
    Points : 169
    Points
    169
    Par défaut
    Bonjour,

    Regardes bien la structure de ton debug, c'est un tableau de tableaux. Il te faut donc remplacer genre.id par genre.0.id.

    De la même façon, le nombre de film associés se trouve dans genre.1

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2012
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Merci pour ta réponse.

    J'ai néanmoins encore une intérrogation. Lorsque on utilise les méthodes de base de la classe Doctrine\ORM\EntityRepository comme findAll().

    on a ce genre de resultat :

    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
    <?php
    array (size=3)
      0 => 
        object(gstyle39\VideothequeBundle\Entity\Film)[723]
          private 'id' => int 5
          private 'genres' => 
            object(Doctrine\ORM\PersistentCollection)[729]
              private 'snapshot' => 
                array (size=0)
                  ...
              private 'owner' => 
                &object(gstyle39\VideothequeBundle\Entity\Film)[723]
              private 'association' => 
                array (size=19)
                  ...
              private 'em' => 
                object(Doctrine\ORM\EntityManager)[656]
                  ...
              private 'backRefFieldName' => string 'films' (length=5)
              private 'typeClass' => 
                object(Doctrine\ORM\Mapping\ClassMetadata)[724]
                  ...
              private 'isDirty' => boolean false
              private 'initialized' => boolean false
              private 'coll' => 
                object(Doctrine\Common\Collections\ArrayCollection)[728]
                  ...
          protected 'title' => string 'Very bad trip' (length=13)
          protected 'director' => string 'Todd Phillips' (length=13)
          private 'date' => 
            object(DateTime)[717]
              public 'date' => string '2012-08-01 00:00:00' (length=19)
              public 'timezone_type' => int 3
              public 'timezone' => string 'UTC' (length=3)
          protected 'description' => string 'Sed aliquam rhoncus ante, ac venenatis odio lobortis vitae. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. ' (length=152)
    c'est la raison pour laquelle on peut récupérer les valeurs en faisant un simple for :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    {% for film in films %}
        <li>
            <a href="{{ path('VideothequeBundle_show', {'id': film.id}) }}">{{ film.title }}</a>
            par {{ film.director }},
            sorti en {{ film.date|date('Y') }}
        </li>
    {% else %}
        <div class="alert">Désolé, il n'y a aucun film dans cette section</div>
    {% endfor %}

    Il n'y a pas moyen d'optimiser le resultat de ma requête ? Même si je trouve que celle ci n'est pas forcement incorrecte...

    Merci d'avance

  4. #4
    Membre habitué Avatar de Avrel
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2010
    Messages : 118
    Points : 177
    Points
    177
    Par défaut
    Ton id est en private, vérifies que tu ais bien une méthode getId() dans ton entité.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2012
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    La méthode existe déjà

Discussions similaires

  1. Parcourir un tableau d'objet dans un tJavaFlex
    Par tetsu no tama dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 30/03/2011, 17h27
  2. parcourir un tableau d'objets verticalement
    Par elamarti dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 04/12/2008, 14h43
  3. Sauvegarde / Chargement d'un tableau d'objets
    Par Naruto dans le forum Langage
    Réponses: 3
    Dernier message: 18/05/2004, 14h34
  4. [VB6]Tableau d'objet withevents
    Par soazig dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 13/02/2004, 19h44
  5. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 15h33

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