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 :

[Custom Repository] Comment récupérer une entité ? [2.x]


Sujet :

Symfony PHP

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Points : 6
    Points
    6
    Par défaut [Custom Repository] Comment récupérer une entité ?
    Bonjour !

    Je cherche a recuperer une entite dans mon champs de formulaire traite par une requete dans mon Custom Repo.
    Je precise que le render de cette fonction est une include dans un autre template twig.

    Le probleme, c'est que je ne recoit qu'un array au lieu d'une entitee oO

    Je vous poste mes sources

    Mon Custom Repo :
    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
     
     
    namespace Luna\KBundle\Repository;
     
    use Doctrine\ORM\EntityRepository;
     
    class SidRepository extends EntityRepository
    {
     
     
        public function retrieveByName($idusr)
        {
     
             /**
              * Creer la requete a l'envers, Sid vers Utilisateurs
              *
              * 
    
             /**
              * Sid -> Site -> Crew -> Users -> Utilisateurs
              */
              */
          return $this->createQueryBuilder('s')
     
                                ->leftJoin('s.site', 'si')
                                ->leftJoin('si.crew', 'c')
                                ->leftJoin('c.users', 'u')
                                ->leftJoin('u.utilisateur', 'ut')
                                ->where('ut = ?1')
                                ->setParameter(1, $idusr)
     
        }
    }
    Ma Fonction dans mon Controlleur :
    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
     
     
    public function chooseAction($idusr)
        {
     
            $em = $this->getDoctrine()->getEntityManager();
            $entities = $em->getRepository('LunaKBundle:Sid')->retrieveByName($idusr);
            $request = $this->getRequest();
     
            if (!$entities) {
                throw $this->createNotFoundException('Je ne trouve pas la Sid entity dans choose.');
            }
            $showForm = $this->createForm(new SidSelect(), $entities);
     
            if ('POST' === $request->getMethod()) {
                $showForm->bindRequest($request);
     
                if ($showForm->isValid()) {
                    $em = $this->getDoctrine()->getEntityManager();
                    $em->persist($entities);
                    $em->flush();
     
                    return $this->redirect($this->generateUrl('Sid_choix', array('id' => $entities->getId())));
     
                }
            }
     
             return $this->render('LunaKBundle:Sid:choose.html.twig', array(
                'entities'      => $entities,
                'form_choose'   => $showForm->createView(),
            ));
        }

    Mon render include dans le template twig :
    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
     
    {% extends '::layout.html.twig' %}
     {% block content %}
    <h1>Planter une graine</h1>
     
    Donner un nom a la graine que vous souhaitez planter.
     
     
    <form action="{{ path('Sid_init', {'idusr': app.user.id}) }}" method="post" {{ form_enctype(form) }}>
        {{ form_widget(form) }}
        <p>
            <button type="submit">Creer</button>
        </p>
    </form>
    Si votre graine est deja plante, choisissez un type d'objet a lui ajouter
    (A voir plus tard :P)
     {% render 'LunaKBundle:Sid:choose' with {'idusr' : app.user.id}  %}
     
    {% endblock %}

  2. #2
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Points : 362
    Points
    362
    Par défaut
    Salut !
    Cela m'étonne déjà que tu récupères un array dans ton retour de fonction du Repository. Il faut normalement demander au QueryBuilder de te renvoyer les résultats par un "getQuery()->getResult()" par exemple.

    Mais si tu veux un seul élément il faut faire un traitement spécial. Moi par exemple je fais quelque chose comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $qb->setMaxResults(1)->getQuery()->getOneOrNullResult();
    Il y a sûrement d'autres moyens, mais il faut bien préciser que tu veux un seul résultat dans ta requête, sinon il te renverra toujours un tableau effectivement.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Salut Guybrush Threepwood


    Alors j'ai tester ta solution de 2 manières
    D'abord dans le controller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     public function chooseAction($idusr)
    {        
            $em = $this->getDoctrine()->getEntityManager();
     
            $entities = $em->getRepository('LunaKBundle:Sid')->retrieveByName($idusr)->setMaxResults(1)->getQuery()->getResult();
    Ca me ressort toujours un Array

    Et dans le Formulaire si je rajoute ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $builder
                ->add('name', 'entity', array( 
                    'class' => 'Luna\\KBundle\\Entity\\Sid',
    'query_builder' => $qb->setMaxResults(1)->getQuery()->getOneOrNullResult(),
    J'obtiens ça parce que le type Entity ne prend qu'un query builder et pas une entité :
    Expected argument of type "Doctrine\ORM\QueryBuilder or \Closure", "Luna\KBundle\Entity\Sid" given"
    Et un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     'query_builder' => $qb->setMaxResults(1),
    Ne me sort qu'un seul résultat dans mon menu déroulant

  4. #4
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Points : 362
    Points
    362
    Par défaut
    Je ne comprends pas ce que tu veux en fait. Tu veux une seule entité dans un menu déroulant ... ?

    Sinon tu peux aussi créer ton queryBuilder dans la construction de ton formulaire, en passant ton $idusr par son constructeur (de ton formType). Je ne sais pas si cela peut t'aider, mais en attente de comprendre réellement ce que tu veux faire...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function __construct($id) {
        $this->id = $id;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $idusr = $this->id;
     
    $builder->add('name', 'entity', array( 
        'class' => 'Luna\\KBundle\\Entity\\Sid',
        'query_builder' => function(\Doctrine\ORM\EntityRepository $er) use ($idusr) {  
            return $er->createQueryBuilder('s')->leftJoin('s.site', 'si')
                                ->leftJoin('si.crew', 'c')
                                ->leftJoin('c.users', 'u')
                                ->leftJoin('u.utilisateur', 'ut')
                                ->where('ut = ?1')
                                ->setParameter(1, $idusr); }
    ));

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

Discussions similaires

  1. Comment récupérer une info d'une page internet ?
    Par Magicien d'Oz dans le forum Réseau
    Réponses: 3
    Dernier message: 12/10/2005, 07h38
  2. Comment récupérer une case d'un dbGrid ?
    Par jeje.r dans le forum Composants VCL
    Réponses: 14
    Dernier message: 22/09/2005, 17h56
  3. Réponses: 2
    Dernier message: 17/08/2005, 14h40
  4. Réponses: 10
    Dernier message: 01/06/2005, 11h30
  5. Comment récupérer une adresse MAC ?
    Par psau dans le forum Développement
    Réponses: 7
    Dernier message: 19/07/2002, 17h26

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