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 :

Symfony 4.2, appeler une méthode d'un Repository dans champ EntityType


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 36
    Par défaut Symfony 4.2, appeler une méthode d'un Repository dans champ EntityType
    Bonjour,

    Après plusieurs recherches et une lecture de la documentation qui me renvois des erreurs, je viens vers vous pour obtenir de l'aide.

    Avant toutes choses, je développe avec Symfony 4.2

    J'ai dans mon Repository "MembersRepository" cette méthode qui me retourne tous les membres qui ne sont pas leader d'une équipe :

    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
     
    public function findAllUnaffected(): array {
        $sql = "
        SELECT
            *
        FROM
            members AS m
        WHERE
            m.id NOT IN (
            SELECT
                    CASE
                WHEN member_id IS NULL THEN 0
                ELSE member_id
                END
            FROM
                teams
            );
        ";
     
        $conn = $this->getEntityManager()->getConnection();
     
        $stmt = $conn->prepare($sql);
        $stmt->execute();
     
        return $stmt->fetchAll();
    }
    Et dans mon Controller ce morceau de code dans lequel je souhaiterais intégrer les données récupérées ci-dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $teams = new Teams();
     
    $form = $this->createFormBuilder($teams)
        ->setAction($this->generateUrl('teams_add'))
        ->add('member', EntityType::class, array(
        'class' => Members::class,
        'choice_label' => 'login'
        ))
        ->add('name', TextType::class)
        ->add('status', CheckboxType::class, array('required' => false))
        ->getForm();
    Seulement voilà, je ne trouve pas comment injecter les données, j'ai essayé avec le paramètre "query_builder", mais ça plante.

    Si vous pouviez me venir en aide, ça serait fort sympathique.

    Merci d'avance.

  2. #2
    Membre Expert

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 581
    Par défaut
    Salut,

    Si j'ai bien compris c'est pour un champ.
    Tu n'utilises pas le querybuilder de doctrine https://www.doctrine-project.org/pro...y-builder.html ? Du côté de entityType https://symfony.com/doc/current/refe...es/entity.html avec l'attribut query_builder tu peux spécifier une requête pour le résultat.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 36
    Par défaut
    Salut,

    J'ai bien essayé, mais si je rajoute le query_builder en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    'query_builder' => function(MembersRepository $mr) {
                        return $mr->findAllUnaffected();
                    }
    Il me renvoi cette erreur : Expected argument of type "Doctrine\ORM\QueryBuilder", "array" given

    Effectivement, ma fonction renvoi un tableau et non un type "Doctrine\ORM\QueryBuilder".

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 36
    Par défaut
    Désolé pour le double post, mais je viens de trouver la solution.

    Merci kevin254kl, t'as réponse m'a mit sur la bonne voie

    Pour ceux qui veulent, je suis tombé sur cette article en peaufinant mes recherches : https://www.wanadev.fr/56-comment-re...avec-doctrine/ On il explique comment faire du SQL mais le retourner au format Entity.

    Du coup, après modification voici mon nouveau code, si cela peut aider d'autres personnes

    Mon 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
    public function findAllUnaffected(): array {
        $sql = "
        SELECT
            m.*
        FROM
            members AS m
        WHERE
            m.id NOT IN (
            SELECT
                    CASE
                WHEN member_id IS NULL THEN 0
                ELSE member_id
                END
            FROM
                teams
            );
        ";
     
        
            // On se prépare à mapper la requête sur le schema de l'Entity
            $rsm = new ResultSetMappingBuilder($this->getEntityManager());
            $rsm->addEntityResult(Members::class, "m");
    
            // On mappe le nom de chaque colonne en base de données sur les attributs de l'Entity
            foreach ($this->getClassMetadata()->fieldMappings as $obj) {
                $rsm->addFieldResult("m", $obj["columnName"], $obj["fieldName"]);
            }
            
            $stmt = $this->getEntityManager()->createNativeQuery($sql, $rsm);
            $stmt->execute();
            
            return $stmt->getResult();
    }
    Mon Controller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $teams = new Teams();
    $members = $this->getDoctrine()->getRepository(Members::class)->findAllUnaffected();
     
    $form = $this->createFormBuilder($teams)
        ->setAction($this->generateUrl('teams_add'))
        ->add('member', EntityType::class, array(
        'class' => Members::class,
        'choices' => $members,
        'choice_label' => 'login'
        ))
        ->add('name', TextType::class)
        ->add('status', CheckboxType::class, array('required' => false))
        ->getForm();

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

Discussions similaires

  1. [ZF 1.11] Appeler une méthode d'un contrôleur dans un plugin
    Par absot dans le forum Zend Framework
    Réponses: 1
    Dernier message: 30/04/2012, 14h11
  2. [objet] appeler une méthode d'objets contenus dans un tableau (iterator ?)
    Par psychomatt dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 21/09/2006, 16h28
  3. Réponses: 2
    Dernier message: 31/08/2005, 16h12
  4. Appeler une méthode dynamiquement
    Par doof dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 03/01/2005, 23h15
  5. Comment l'appel à une méthode virtuelle....
    Par Blobette dans le forum C++
    Réponses: 7
    Dernier message: 07/12/2004, 13h55

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