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

Doctrine2 PHP Discussion :

Requete doctrine correct


Sujet :

Doctrine2 PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 27
    Par défaut Requete doctrine correct
    Bonjour,

    J'ai une requête Doctrine à faire et j'aimerais la faire le plus proprement possible.
    Pour faire simple :
    J'ai une classe Lieu, une classe Stand (genre stand fruit et légume), une classe Spectacle.

    Une lieu peut accueillir aucun ou N Stand
    Une lieu peut acceuillir aucun ou N Spectacle
    Une Spectacle se déroule dans 1 et 1 seul Lieu
    Un Stand est posé dans 1 et 1 seul Lieu

    Ce que je doit faire c'est une liste des Lieux accueillant un Spectacle.
    Et une liste des Lieux comportant un Stand.

    J'avais d'abord passé faire une lister tous les Spectacles et tous les Stands:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $spectacles= $em->getRepository('MyappPrincipalBundle:Spectacle')->findAll();
    $stads= $em->getRepository('MyappPrincipalBundle:Stand')->findAll();

    Puis faire une lister les lieux accueillant des spectacles en me basant sur l'id_lieu de Spectacle :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //lieu accueillant des spectacle
    $lieu_spectacles= $em->getRepository('MyappPrincipalBundle:Lieu')->findById($spectacles->getLieu());
    //idem pour les stand
    $lieu_stands= $em->getRepository('MyappPrincipalBundle:Lieu')->findById($stands->getLieu());
    Je suis quasiment sur que ces requêtes sont fausses mais ces pour expliquer mon problème.

    Donc au final j'aurai voulu connaitre la façon la plus propre de faire ce que je veux faire .
    En espérant avoir été suffisamment clair.
    merci d'avance

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Bonjour,

    Consulte la doc sur le DQL : http://www.doctrine-project.org/docs...-language.html

    ça devrait ressembler à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $dql="SELECT li  FROM MyappPrincipalBundle:Lieu li INNER JOIN li.spectacles";
    $lieuxHavingASpectacle=$em->createQuery($dql)->getResult();

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 27
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $dql="SELECT l FROM MyappPrincipalBundle:Lieu l WHERE l.id =(SELECT s.id_lieu FROM MyappPrincipalBundle:Spectacle s INNER JOIN s.lieu)";
    Voila ce que j'essaie de faire en fait. Bien entendu Doctrine ne doit pas permettre les requêtes imbriquées car j'ai ce message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CRITICAL: Doctrine\ORM\Query\QueryException: [Syntax Error] line 0, col -1: Error: Expected Doctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS, got end of string. (uncaught exception) at C:\xxxxxxxx\project\vendor\doctrine\lib\Doctrine\ORM\Query\QueryException.php line 42 [] []

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Théoriquement le INNER JOIN ne doit renvoyer que les lieux qui ont (au moins) un spectacle
    (comme en sql).
    regarde si cela fait une différence avec un JOIN simple (notamment dans le profiler Symfony)

    Si ça marche vraiment pas essaie quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT li FROM MyappPrincipalBundle:Lieu li WHERE COUNT(li.spectacle)>0
    les requetes imbriqués sont supportés dans une certaine mesure par le DQL mais ta requete pose probleme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT l 
    FROM MyappPrincipalBundle:Lieu l 
    WHERE l.id 
    = /*l.id est un integer et le retour de ton select est un tableau d'entier donc le signe égal ne peut fonctionner*/
    ( 
     SELECT s.id_lieu /*ton entité spectacle n'a pas d'attribut id_lieu (c'est le nom de la colonne dans ta table certes mais l'entité en elle-même a un attribut lieu et pas un attribut lieu_id*/
     FROM MyappPrincipalBundle:Spectacle s 
     INNER JOIN s.lieu
    )

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 27
    Par défaut
    Ça ne fonctionne pas car dans ma classe Lieu je n'ai pas d'attribut spectacles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [Semantical Error] line 0, col -1 near 'SELECT li FROM': Error: Class Myapp\PrincipalBundle\Entity\Lieu has no association named spectacles
    Ça me parait plutôt logique, le lien se fait dans les classes Spectacle et Stand.
    J'ai un attribut lieu dans Spectacle et Stand.

    Après il est tout à fait envisageable que j'ai mal conçu mes classes .

  6. #6
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Le plus simple serait quand même de créer une relation bidirectionnellle
    lieu->spectacles <==>spectacle->lieu
    http://www.doctrine-project.org/docs...-bidirectional

    Si tu as une bonne raison pour ne pas faire ainsi essaie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT l
    FROM MyappPrincipalBundle:Lieu l
    WHERE l.id 
    IN
    (  SELECT ls.id
        FROM MyappPrincipalBundle:Spectacle s 
        INNER JOIN s.lieu ls )

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 27
    Par défaut
    Je te remercie infiniment, j'ai pas encore testé en détail mais ta requête à l'air de fonctionner.

    Par contre du coup j'aurais une question sur le fait créer une relation bidirectionnelle.

    Pour le faire il faut que j'ajoute ceci à ma classe Lieu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    /**
    * @ORM\OneToMany(targetEntity="Spectacle")
    */ 
    private $spectacle;
     
    /**
    * @ORM\OneToMany(targetEntity="Stand")
    */ 
    private $stand;
    Est-ce bien ça ?

  8. #8
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    ça doit ressembler à cela:
    dans My/Entity/Lieu.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /**
    ** le mappedBy fait référence au nom de l'attribut dans ton entité Spectacle
    *
    * @ORM\OneToMany(targetEntity="My\Bundle\Entity\Spectacle" ,mappedBy="lieu")
    */ 
    private $spectacles;//c'est plus logique de le mettre au pluriel
    
    public __construct(){
    $this->spectacles=new \Doctrine\Common\ArrayCollections\Collection()
    }
    dans My/Entity/Spectacle.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /**
    * @ORM\ManyToOne(targetEntity="My\Bundle\Entity\Lieu" ,inversedBy="spectacles")
    * @ORM\JoinColumn(//etc... si besoin
    */ 
    private $lieu;

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 27
    Par défaut
    J'ai testé la requête imbriqué, elle marche niquel.

    J'ai aussi essayé de créer une relation bidirectionnellle et ça fonctionne niquel.
    Je vais suivre ton conseil et utiliser cet méthode.

    Un grand MERCI à toi pour ton aide .

  10. #10
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    De rien,
    pense à passer le sujet en résolu

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

Discussions similaires

  1. [MySQL] Ecrire une requete mysql correctement
    Par mejrs dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 22/01/2010, 17h22
  2. requete sql correcte ou pas
    Par Invité dans le forum JDBC
    Réponses: 3
    Dernier message: 18/11/2009, 00h19
  3. Requete SQL correction erreurs dans requete
    Par mihaispr dans le forum Développement
    Réponses: 3
    Dernier message: 15/10/2009, 15h28
  4. requete HTTPS correcte
    Par SiX-P4cK dans le forum Sécurité
    Réponses: 4
    Dernier message: 09/06/2009, 09h39
  5. [MySQL] Requete SQL correcte Mais aucun affichage
    Par jenga dans le forum PHP & Base de données
    Réponses: 21
    Dernier message: 10/04/2006, 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