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 :

Requête avec jointures [2.x]


Sujet :

Symfony PHP

  1. #1
    Modérateur
    Avatar de Kreepz
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2011
    Messages : 681
    Billets dans le blog
    1
    Par défaut Requête avec jointures
    Bonjour,

    Je fais mes premiers pas sur Symfony2 et je dois dire que je rencontre quelques soucis pour les requêtes...
    J'ai deux tables une "Contacts" et une "Categories" et j'ai généré les entitées à partir de la console ainsi que les CRUD.

    Ma table "Contacts" se compose: ID|NOM|PRENOM|...|ID_CATEGORIE
    Et la table "Categories" : ID|LIBELLE

    Et sur mon index contacts le CRUD récupère de base tout les contacts avec un findAll() mais ce que je voudrais à la place de l'id_categorie c'est le libellé de celui-ci.

    Voici le code de mon entité "Contacts":
    Code PHP : 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer", nullable=false)
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $id;
     
        /**
         * @var string
         *
         * @ORM\Column(name="nom", type="text", length=65535, nullable=false)
         */
        private $nom;
     
        /**
         * @var string
         *
         * @ORM\Column(name="prenom", type="text", length=65535, nullable=false)
         */
        private $prenom;
     
        /**
         * @var string
         *
         * @ORM\Column(name="email", type="string", length=200, nullable=false)
         */
        private $email;
     
        /**
         * @var string
         *
         * @ORM\Column(name="telephone", type="string", length=20, nullable=false)
         */
        private $telephone;
     
        /**
         * @var \Categories
         *
         * @ORM\ManyToOne(targetEntity="Categories")
         * @ORM\JoinColumns({
         *   @ORM\JoinColumn(name="id_categorie", referencedColumnName="id")
         * })
         */
        private $idCategorie;

    Donc j'ai bien la liaison avec la table categories mais je ne voie pas comment faire la requête.

    Merci pour votre aide!
    Pensez à regarder nos cours et tutoriels PHP ainsi que notre FAQ PHP avant de poser votre question!
    Un message vous a aidé, n'oubliez pas le

  2. #2
    Membre Expert
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 419
    Par défaut
    Bonjour,

    première erreur :
    devrait être :
    Et ensuite, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $contact->getCategorie()->getLibelle()
    Voir même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $contact->getCategorie()
    Si tu fais l'une des choses suivantes :
    - renommer libellé en "name" (à vérifier)
    - définir la méthode __toString() de Categorie pour qu'elle retourne $this->libelle

    bon courage.

    pierre

  3. #3
    Modérateur
    Avatar de Kreepz
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2011
    Messages : 681
    Billets dans le blog
    1
    Par défaut
    Bonjour, merci pour ta réponse.

    Petite question si je change idCategorie en categorie, dois-je changer le type indiqué dans l'annotation?
    Pensez à regarder nos cours et tutoriels PHP ainsi que notre FAQ PHP avant de poser votre question!
    Un message vous a aidé, n'oubliez pas le

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Par défaut
    Tu peux mettre une requête sql dans un Repository (tu peux faire autrement mais je crois que c'est la plus propre):
    Voila un exemple complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /**
     * sujet
     *
     * @ORM\Table(name="sujet")
     * @ORM\Entity
     * @ORM\Entity(repositoryClass="MyApp\ForumBundle\Repository\sujetRepository")
     *  
     */
    et dans ce repository tu mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    namespace MyApp\ForumBundle\Repository;
     
    use Doctrine\ORM\EntityRepository;
     
    class sujetRepository extends EntityRepository {
     
        public function getAllsujet() {
            return $this->getEntityManager()
                            ->createQuery('SELECT p FROM MyAppForumBundle:sujet p  ORDER BY  p.datecreation DESC  ')
                            ->getResult();
        }
    }
    et au lieu de faire findAll() tu mets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $sujet = $em->getRepository('MyAppForumBundle:sujet')->getAllsujet(); // getAllsujet est déja decrit dans le repository

  5. #5
    Modérateur
    Avatar de Kreepz
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2011
    Messages : 681
    Billets dans le blog
    1
    Par défaut
    Merci pour vos réponses, j'ai utilisé ta méthode mehrezlabidimehrez qui me paraissait plus claire et ça fonctionne!
    Pensez à regarder nos cours et tutoriels PHP ainsi que notre FAQ PHP avant de poser votre question!
    Un message vous a aidé, n'oubliez pas le

  6. #6
    Membre Expert
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 419
    Par défaut
    c'est un peu porc et complétement à l'opposé de la logique doctrine comme solution...
    Du SQL dans un ORM, ce n'est pas propre, c'est même plutôt dégueulasse...


    Pour résumé, ton entité décrit des objet, d'ou le fait que tu doive avoir une catégorie et non un id.
    Ensuite, ton objet catégorie sera décrit dans une autre entité Catégorie et contiendra elle un id et un libelle. (+ les getter et setter qui vont bien).

    C'est ce qui permet d'utiliser findAll(), et ensuite pour tous les objets retournés d'ouvrir les objets catégorie, et de les utiliser. Doctrine s'occupe alors de faire la jointure pour toi, ou si tu veux optimiser, tu peux lui dire de faire la jointure.

    Si tu fais du SQL dans Doctrine, désinstalle le, ca sera plus sur.

  7. #7
    Membre chevronné
    Avatar de phpiste
    Homme Profil pro
    Développeur Senior
    Inscrit en
    Septembre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Senior
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 251
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par pmithrandir Voir le message
    c'est un peu porc et complétement à l'opposé de la logique doctrine comme solution...
    Du SQL dans un ORM, ce n'est pas propre, c'est même plutôt dégueulasse...
    Doc officielle:
    http://doctrine-orm.readthedocs.org/...ative-sql.html

    et ça restera propre (and safe) temps qu'il utilise des setParameter pour caster les données
    (l'alias MyAppForumBundle:sujet déjà mis dans la requette est une bonne pratique)


  8. #8
    Membre Expert
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 419
    Par défaut
    Bonjour,

    j'utilise aussi du SQL dans doctrine, ou du DQL.
    Mais je ne pense pas que ca soient la solution pour les problèmes de jointures comme celui la.

    Le SQL dans son hypothèse, c'est juste passer outre l'ORM et n'utiliser que Doctrine DBAL.

    En général, on l'utilise uniquement quand on a des problèmes de perf ou qu'on a besoin de requêtes non supportées. (UNION je pense par exemple, même si je n'ai jamais essayé)

    Surtout, écrire du code quand il suffit d'utiliser ce qui est founir sur tous les objets... c'est bizarre.

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

Discussions similaires

  1. Requête avec jointure
    Par Maglight dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/11/2005, 09h57
  2. optimisation d'une requête avec jointure
    Par champijulie dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 07/07/2005, 09h45
  3. Requête avec jointures
    Par Corben dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/11/2004, 12h55
  4. Mise à jour de table impossible après requête avec jointure
    Par sto dans le forum Bases de données
    Réponses: 5
    Dernier message: 17/03/2004, 13h24
  5. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33

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