Partage
  • Partager sur Facebook
  • Partager sur Twitter

Manipulation d'une ArrayCollection (Symfony)

    3 février 2017 à 16:30:10

    Bonjour à tous 

    Je suis devant une vraie question technique en rapport avec l'objet 'ArrayCollection'. Comme vous devez le savoir, cet classe dispose d'une méthode bien pratique appelée "matching". Pour disposer de cette méthode il faut définir des critères de correspondance via l'objet 'Criteria'. 

    J'ai créé un liste de type 'ArrayCollection' et je souhaiterai filtrer certaines entrées de cette liste. J'ai envisagé d'utilisé la fonction "filter" mais elle ne correspond pas à ce que je cherches. 

    En utilisant l'objet 'Criteria' dans mon 'ArrayCollection' et à l'aide des nombreuses méthodes de comparaison, j'espérait avoir trouvé ce que je cherchais, cependant je suis confronté à un problème :o : dans mon 'ArrayCollection' se trouvent des objets et tous leurs attributs sont privés (comme la bonne pratique le recommande :p). 

    La question est donc la suivante -> Comment puis-je accéder aux attributs des objets de mon 'ArrayCollection' malgré leurs visibilité 'protected' ?

    Vais-je être obligé de changer cette visibilité ? 

    Y-a-t'il une autre solution ? 

    Si vous en avez une je suis preneur :D

    • Partager sur Facebook
    • Partager sur Twitter
      3 février 2017 à 17:43:02

      Salut !

      Normalement, ce qui fait fonctionner matching() devrait passer par les méthodes d'accès de Doctrine, et donc regarder si il y a moyen d'accéder directement à la propriété, sinon passer par get*().

      Est-ce que tu as déjà essayé, ou tu venais juste t'assurer avant de tester que le test serait réussi ?  :p

      • Partager sur Facebook
      • Partager sur Twitter
        6 février 2017 à 9:26:16

        Ymox a écrit:

        Salut !

        Normalement, ce qui fait fonctionner matching() devrait passer par les méthodes d'accès de Doctrine, et donc regarder si il y a moyen d'accéder directement à la propriété, sinon passer par get*().

        Est-ce que tu as déjà essayé, ou tu venais juste t'assurer avant de tester que le test serait réussi ?  :p


        Le "moyen d'accéder directement à la propriété", comme tu dis c'est justement ce que je cherches o_O

        Et je n'utilise pas la persistance en BDD de Doctrine, mon but est juste de manipuler les données d'un fichier dans le but dans générer un autre. 

        Et comment pourrais-je utiliser une seule méthode 'get()' pour accéder à une propriété de tous les objets de l'ArrayCollection ? :euh:

        • Partager sur Facebook
        • Partager sur Twitter
          6 février 2017 à 9:28:36

          dustman317 a écrit:

          Le "moyen d'accéder directement à la propriété", comme tu dis c'est justement ce que je cherches o_O.

          Et je n'utilise pas la persistance en BDD de Doctrine, mon but est juste de manipuler les données d'un fichier dans le but dans générer un autre.

          Et comment pourrais-je utiliser une seule méthode 'get()' pour accéder à une propriété de tous les objets de l'ArrayCollection ? :euh:

          Tout le souci est là : normalement, tu n'as pas à t'en soucier, c'est Doctrine (qui fournit les ArrayCollection, indépendamment de la couche de persistance réellement utilisée) qui se débrouille pour les accès aux valeurs des propriétés des objets.

          -
          Edité par Ymox 6 février 2017 à 9:29:06

          • Partager sur Facebook
          • Partager sur Twitter
            6 février 2017 à 9:57:10

            Ymox a écrit:

            dustman317 a écrit:

            Le "moyen d'accéder directement à la propriété", comme tu dis c'est justement ce que je cherches o_O.

            Et je n'utilise pas la persistance en BDD de Doctrine, mon but est juste de manipuler les données d'un fichier dans le but dans générer un autre.

            Et comment pourrais-je utiliser une seule méthode 'get()' pour accéder à une propriété de tous les objets de l'ArrayCollection ? :euh:

            Tout le souci est là : normalement, tu n'as pas à t'en soucier, c'est Doctrine (qui fournit les ArrayCollection, indépendamment de la couche de persistance réellement utilisée) qui se débrouille pour les accès aux valeurs des propriétés des objets.

            -
            Edité par Ymox il y a 24 minutes

            C'est vrai que pour l'instant on peux dire je génère l'ArrayCollection de façon "artificielle" (cette ArrayCollection ne viens pas vraiment de Doctrine): 

            private function assuProcess(SessionInterface $session, \PHPExcel_Worksheet $workSheet, $lastRow)
                {
                    $listeDemandesAssu = new ArrayCollection();
                    $listeCodeProjets = new ArrayCollection();
                    $listePresta = new ArrayCollection();
            
                    for ($row = 5; $row < $lastRow; $row++) {
            
                        $codeProjet = $workSheet->getCell( 'A' .$row)->getValue();
                        $labelCodDemColumn = $workSheet->getCell ( 'B' . $row )->getValue ();
                        $budgetColumn = $workSheet->getCell ( 'F' . $row )->getFormattedValue();
                        $statutDemColumn = $workSheet->getCell ( 'H' . $row )->getValue ();



            Donc serais-tu en train de me dire qu'il faudrait que je persiste le fichier brut en base pour ensuite manipuler ses données sans soucis ? o_O

            -
            Edité par dustman317 6 février 2017 à 9:59:56

            • Partager sur Facebook
            • Partager sur Twitter
              6 février 2017 à 10:06:15

              Non, je suis en train de te dire que matching() n'a à mon avis pas besoin que tu te soucies de comment accéder aux propriétés de ton objet. Tu écris tes contraintes, et derrière, c'est Doctrine qui regarde si ce sont des propriétés publiques ou si elle doit passer par les accesseurs que tu auras créé.

              Doctrine n'est pas uniquement une couche de persistance, c'est aussi (dans ce cas) un outil de manipulation de données plus général, même si celles-ci ne sont pas persistées.

              […] you can use collection matching interchangeably, independent of in-memory or sql-backed collections. http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-associations.html#filtering-collections

              -
              Edité par Ymox 6 février 2017 à 10:07:44

              • Partager sur Facebook
              • Partager sur Twitter
                6 février 2017 à 10:44:07

                Voilà à quoi ressemble l'un de mes objets de mon ArrayCollection qui se nomme "ListeDemandeAssu"

                Lorsque j'exécute ce code ci : 

                $criteria = Criteria::create()
                            ->where(Criteria::expr()->eq('cod_demande', 'CDS-660'));
                
                
                        var_dump($listeDemandesAssu->matching($criteria));


                J'obtiens l'exception suivante: 

                Et voici les bundles que j'utilises : 

                use Doctrine\Common\Collections\ArrayCollection;
                use Doctrine\Common\Collections\Criteria;
                use PDC\FrontBundle\Entity\DemandeAssu;
                use Symfony\Bundle\FrameworkBundle\Controller\Controller;
                use PHPExcel_IOFactory;
                use Symfony\Component\HttpFoundation\Request;
                use Symfony\Component\HttpFoundation\Session\SessionInterface;



                -
                Edité par dustman317 6 février 2017 à 10:46:58

                • Partager sur Facebook
                • Partager sur Twitter
                  6 février 2017 à 10:48:20

                  Est-ce que tu as bien une méthode getCodDemande() publique dans tes objets DemandeAssu ?

                  J'insiste sur le nom, getCod_demande() pourrait bien ne pas fonctionner, justement.

                  Où l'inverse, c'est selon  :p

                  -
                  Edité par Ymox 6 février 2017 à 10:50:14

                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 février 2017 à 10:54:39

                    Ymox a écrit:

                    Est-ce que tu as bien une méthode getCodDemande() publique dans tes objets DemandeAssu ?

                    J'insiste sur le nom, getCod_demande() pourrait bien ne pas fonctionner, justement.

                    Où l'inverse, c'est selon  :p

                    -
                    Edité par Ymox il y a 2 minutes


                    Voilà ce qu'il y a dans ma classe DemandeAssu 

                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 février 2017 à 10:58:22

                      Et si tu tentes d'en créer une (juste pour tester) qui fasse exactement la même chose, mais qui s'appelle getCod_demande(), comment ça se passe ?

                      • Partager sur Facebook
                      • Partager sur Twitter
                        6 février 2017 à 11:05:48

                        En changeant le nom du getter comme tu dis je n'ai plus d'erreur mais mon dump est vide alors qu'il y a bel et bien un objet avec un 'cod_demande' égal à 'CDS-660' dans mon ArrayCollection: 

                        Petite précision => Je bosse avec PHPStorm et les 'Getters Setters' ont été générés automatiquement 

                        -
                        Edité par dustman317 6 février 2017 à 11:09:54

                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 février 2017 à 11:16:46

                          Bon, on a déjà pu comprendre que le souci venait du nom de la propriété et de son accesseur. Si tu utilises codDemande dans ton Criteria plutôt que cod_demande, c'est pas totalement juste, mais on devrait pouvoir accéder correctement aux propriétés sans modification de ton entité.

                          Maintenant, le fait que tu aies en retour un ArrayCollection vide me fait penser que tu n'as pas vraiment CDS-660 dans ta propriété — tu m'as masqué un bout qui semble pourtant faire partie de la valeur, alors à moins que tu aies simplifié pour expliquer, 'CDS-660' != 'CDS-660 spécialisation truc muche d'applications'^^

                          • Partager sur Facebook
                          • Partager sur Twitter
                            6 février 2017 à 13:50:23

                            Je crois que j'ai réussi à régler mon problème (grâce à toi). 

                            En fait je n'avais pas fini d'implémenter mes méthodes de formatage de données (ce qui explique pourquoi j'avais encore un libellé derrière mon code demande dans mon attribut 'cod_demande'). Ainsi lorsque j'utilisait la fonction 'matching()' sur mes objets cela ne pouvais pas fonctionner car ça ne correspondait pas. 

                            Apparemment il y avait aussi un problème au niveau du nommage des accesseurs (Doctrine ne semblait pas les reconnaître correctement pour une raison qui m'échappe encore).

                            A part ça le problème semble être résolu  

                            Par contre j'ai une autre question : 

                            Y'a t il un moyen d'utiliser des conditions qui ne se vérifient pas (genre 'isNotNull', etc..) ? 

                            -
                            Edité par dustman317 6 février 2017 à 13:59:44

                            • Partager sur Facebook
                            • Partager sur Twitter
                              6 février 2017 à 15:09:28

                              La page dont j'ai fourni le lien dans mon antépénultième message liste les méthodes disponibles. Apparemment, isNotNull() n'y figure pas, je te laisse regarder pour les autres.  ^^

                              Quant au système de noms et de getters, c'est très probablement parce que Doctrine se base sur PSR-2 qui recommande que les propriétés soient nommées en lowerCamelCase et non en snake_case — ne pas mélanger propriétés d'objets et colonnes de base de données dans ce cas.

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Manipulation d'une ArrayCollection (Symfony)

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown