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 :

Erreur sur requete avec jointure [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 194
    Points : 200
    Points
    200
    Par défaut Erreur sur requete avec jointure
    Bonjour,

    J'ai un souci que je ne comprend pas, lorsque je fait appel a ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $repository2 = $this->getDoctrine()
                ->getRepository("AppCacBundle:TCac");
    $cac = $repository2->find($request->get('cacId'));
    tout fonctionne nicquel.

    Lorsque de fait ma propre fonction dans le repository, afin d'avoir toutes les informations :

    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
     
    public function findCacInfo($cacId)
        {
            $q = $this->createQueryBuilder('c')
                    ->select('c, d, t, i')
                    ->join('c.tcacadresse', 'd')
                    ->join('c.tcactype', 't')
                    ->join('c.tcivilite', 'i')
                    ->where('c.id = :val')
                    ->setParameter('val', ''.$cacId.'');
            try {
                return $q->getQuery()->getResult();
            } catch (Exception $ex) {
                return $ex;
            }
        }
    j'ai cette erreur :

    FatalErrorException: Error: Call to a member function geTCacType() on a non-object in /Applications/MAMP/htdocs/cac/src/App/CacBundle/Controller/app/GestionCAC/EditionCAC/EditionCACController.php line 58
    J'ai cherché sur le net, mais sans résultat (je suis peut être passé à coté, ça fait 2 jours que je suis dessus)

    Merci par avance pour vos aides.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    tu essayes d'appeler geTCacType() sur un objet null.
    je pense que ton code posté nous permet pas de te débuguer plus que ca, quand utilises tu cette méthode?

    Au passage
    Si ta requête doit renvoyer potentiellement un résultat, et jamais plusieurs mais potentiellement 0, utilises return $q->getQuery()->getOneOrNullResult();
    Si ta requête doit renvoyer toujours un seul résultat et jamais aucun, utilises return $q->getQuery()->getSingleResult();
    Si ta requête doit renvoyer une collection de résultat, utilises return $q->getQuery()->getResult();

  3. #3
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 194
    Points : 200
    Points
    200
    Par défaut
    Merci de ton aide,

    dans mon controller, ça donne ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $repository2 = $this->getDoctrine()
                ->getRepository("AppCacBundle:TCac");
            $cac = $repository2->findCacInfo($request->get('cacId'));
    
    if($cac->geTCacType() == "1") {
                $repo4 = $this->getDoctrine()->getRepository("AppCacBundle:TVille");
                $cvil = $repo4->find($cac->geTCacLieuNaissance());
            } else {
                $cvil = array();
            }
    dans mon entité, cette fonction est comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    /**
         * Get cacType
         *
         * @return integer 
         */
        public function geTCacType()
        {
            return $this->cacType;
        }

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public function findCacInfo($cacId)
        {
            $q = $this->createQueryBuilder('c')
                    ->select('c, d, t, i')
                    ->join('c.tcacadresse', 'd')
                    ->join('c.tcactype', 't')
                    ->join('c.tcivilite', 'i')
                    ->where('c.id = :val')
                    ->setParameter('val', $cacId); //pas besoin de transformer le int en string, l'orm le fait
     
            return $q->getQuery()->getSingleResult(); //renvoit un objet plutot qu'une collection
     
        }

  5. #5
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 194
    Points : 200
    Points
    200
    Par défaut
    Je viens de tester, cela me donne :

    No result was found for query although at least one row was expected.
    je suis en train de me dire si ma le fait que ma table CacAdresse soit vide, ne pose pas de problème, et du coup, ma requête n'est pas bonne.

    J'ai simplifié m'a requête pour avoir que l'essentiel, pour tester, comme 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
     
    public function findCacInfo($cacId)
        {
            $q = $this->createQueryBuilder('c')
                    ->select('c, d')
                    ->join('c.tcacadresse', 'd')
                    ->where('c.id = :val')
                    ->setParameter('val', ''.$cacId.'');
            try {
                return $q->getQuery()->getSingleResult();
            } catch (Exception $ex) {
                return $ex;
            }
        }
    J'ai la même erreur.

  6. #6
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 194
    Points : 200
    Points
    200
    Par défaut
    Je problème viens du fait que ma table CacAdresse est vide, est-il possible d'avoir les résultats, même quand cette table est vide ?

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    bien sur que si ta table, ou plus largement ta base de données est vide il faut pas t'attendre a avoir des résultats...
    Pourquoi tu la remplis pas?
    Après tu peux toujours faire

    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
    try{
           $repository2 = $this->getDoctrine()
                ->getRepository("AppCacBundle:TCac");
            $cac = $repository2->findCacInfo($request->get('cacId'));
     
           if($cac->geTCacType() == "1") {
                $repo4 = $this->getDoctrine()->getRepository("AppCacBundle:TVille");
                $cvil = $repo4->find($cac->geTCacLieuNaissance());
            } else {
                $cvil = array();
            }
    } catch ( \Doctrine\ORM\NoResultException $e ) {
       //ici je n'ai pas eu de résultat
       //je peux par exemple afficher un message d'erreur ou rediriger
    }
    Tu peux connaitre les exceptions levés par doctrine facilement en regardant le code de getSingleResult()

  8. #8
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 194
    Points : 200
    Points
    200
    Par défaut
    Ma base n'est pas vide, ma table principale cac est renseigné, je veux justement récupéré les informations de ma table principale avec celle de ma table secondaire, sachant qu'il est possible, qu'il y ai rien dans ma table secondaire.

    Quand je fait appel uniquement à ma table principale comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $repository2 = $this->getDoctrine()
                ->getRepository("AppCacBundle:TCac");
    $cac = $repository2->find($request->get('cacId'));
    aucun problème.

    Le problème, ne viendrait-il pas de la déclaration de jointure des mes entités:

    TCAC
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /**
         * @ORM\OneToMany(targetEntity="TCacAdresse", mappedBy="TCac", cascade={"all"})
         */
        protected $tcacadresse;
    TCacAdresse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     /**
         * @ORM\ManyToOne(targetEntity="TCac", inversedBy="tcacadresse")
         * @ORM\JoinColumn(name="cad_cac_id", referencedColumnName="cac_id")
         */
        protected $TCac;

  9. #9
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Ah désolé, on est habitué a tout ici
    essayes d'utiliser ->leftJoin()à la place de l->join()

  10. #10
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 194
    Points : 200
    Points
    200
    Par défaut
    C'est bon, cela fonctionne.

    Un grand merci.

    Juste pour info, dans le twig, il faut tester l’existence de la variable, sinon on a droit encore a une belle erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <input type="text" name="cadAdress1" id="cadAdress1" size="40"
                                       value="{% if cac.tcacadresse.cadAdress1 is defined %}
                                       {{ cac.tcacadresse.cadAdress1 }}
                                       {% endif %}"
                                       class="text ui-widget-content ui-corner-all">

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

Discussions similaires

  1. Requete avec jointure sur la même table
    Par CaptainChoc dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/04/2009, 12h30
  2. [MySQL] souci sur une requete avec jointure
    Par fey dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 08/09/2008, 11h11
  3. Besoin d'aide sur une requete avec jointure et MAX()
    Par droog dans le forum Requêtes
    Réponses: 4
    Dernier message: 04/07/2007, 18h23
  4. Pb sur une requete avec jointure droite
    Par crashyear dans le forum Langage SQL
    Réponses: 3
    Dernier message: 06/02/2007, 08h06
  5. [MySQL] Erreur dans une requête avec jointures
    Par bobic dans le forum Langage SQL
    Réponses: 17
    Dernier message: 03/08/2006, 13h04

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