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

ORM PHP Discussion :

[Doctrine] Limit dans requete avec Doctrine


Sujet :

ORM PHP

  1. #1
    Membre éclairé Avatar de Shandler
    Profil pro
    Inscrit en
    Février 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 514
    Par défaut [Doctrine] Limit dans requete avec Doctrine
    Bonjour,

    J'ai un souci avec une requête dans symfony que je comprend pas.
    J'ai donc la requête qui marche très bien ci-dessous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     $this->titre = Doctrine::getTable('Intitule')
                       ->createQuery('t')
                       ->leftJoin('t.MonTextes c')
                       ->execute();
    Et donc j'ai voulu mettre une limit pour l'affichage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     $this->titre = Doctrine::getTable('Intitule')
                       ->createQuery('t')
                       ->leftJoin('t.MonTextes c')
                       ->limit(10)
                       ->execute();
    Et donc mon problème est qu'il ne prend pas en compte ma limit.

    Merci pour votre aide.

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut


    fetchOne() retourne un enregistrement, quel est l'intérêt de limité le retour à un maximum de 10 dans ce cas ?

  3. #3
    Membre éclairé Avatar de Shandler
    Profil pro
    Inscrit en
    Février 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 514
    Par défaut
    Désolé mais étant débutant sur symfony jai fais divers test et j'ai oublie de remettre execute, donc jai corrigé mais mon probléme est toujours la.

    Merci

  4. #4
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    No problème, mais la question était ... saugrenue !

    Quel est la requête générée en SQL ?

    Tu la trouveras dans la barre de debug de symfony.

  5. #5
    Membre éclairé Avatar de Shandler
    Profil pro
    Inscrit en
    Février 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 514
    Par défaut
    Sans le limit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT t.id AS t__id, t.id_user AS t__id_user, t.title AS t__title, t.is_public AS t__is_public, t.is_activated AS t__is_activated, t.created_at AS t__created_at, t.updated_at AS t__updated_at, c.id AS c__id, c.id_titre AS c__id_titre, c.chapitre AS c__chapitre, c.page_contenu AS c__page_contenu, c.num_page AS c__num_page, c.created_at AS c__created_at, c.updated_at AS c__updated_at FROM intitule t LEFT JOIN montexte c ON t.id = c.id_titre
    0.01s, "doctrine" connection
    Et avec le limit il me cree une autre requete en plus :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT t.id AS t__id, t.id_user AS t__id_user, t.title AS t__title, t.is_public AS t__is_public, t.is_activated AS t__is_activated, t.created_at AS t__created_at, t.updated_at AS t__updated_at, c.id AS c__id, c.id_titre AS c__id_titre, c.chapitre AS c__chapitre, c.page_contenu AS c__page_contenu, c.num_page AS c__num_page, c.created_at AS c__created_at, c.updated_at AS c__updated_at FROM intitule t LEFT JOIN montexte c ON t.id = c.id_titre WHERE t.id IN ('1')
     
    SELECT DISTINCT t2.id FROM intitule t2 LIMIT 10
    Merci a toi

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Par défaut
    Peut-être un peu de doc pour aider : limit and offset clauses in Doctrine.

    Notamment, si on lit la 2ème partie "The limit-subquery-algorithm", on peut voir que la requête générée semble très proche de la tienne cependant que la clause IN inclue, dans leur exemple, une subquery alors que, dans ton exemple, je ne vois pas à quoi le IN('1') fais référence ?

  7. #7
    Membre éclairé Avatar de Shandler
    Profil pro
    Inscrit en
    Février 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 514
    Par défaut
    Le IN('1') doit l'ID de la table Intitule je pense, j'ai essayé en utilisant un select des champs a afficher mais le problème persiste, je comprend pas ce qui bloque.

    Merci a vous.

  8. #8
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Tu peux mettre ton shema.yml ?

    Je soupçonne un problème dans la définition des relations.

  9. #9
    Membre éclairé Avatar de Shandler
    Profil pro
    Inscrit en
    Février 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 514
    Par défaut
    Ci dessous mon schema :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Intitule:
      columns:
        id_user:  { type: integer, notnull: true }
        title: { type: string(255), notnull: true }
     
    MonTexte:
      columns:
        id_titre:  { type: integer, notnull: true }
        chapitre: { type: boolean, notnull: true, default: 1 }
        page_contenu: { type: text, notnull: true }
        num_page: { type : smallint, notnull: true }
      relations:
        Intitule: { onDelete: CASCADE, local: id_titre, foreign: id, foreignAlias: MonTextes }
    Merci a toi

  10. #10
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    J'aurais fais le shema.yml presque pareil

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    intitule:
      columns:
        user_id:  { type: integer, notnull: true }
        title: { type: string(255), notnull: true }
     
    monTexte:
      columns:
        intitule_id:  { type: integer, notnull: true }
        chapitre: { type: boolean, notnull: true, default: 1 }
        page_contenu: { type: text, notnull: true }
        num_page: { type : smallint, notnull: true }
      relations:
        intitule: { onDelete: CASCADE, foreignAlias: monTextes }
    Juste que jamais de majuscule dans les noms de tables et les champs de liaison, sauf exception, c'est nom de la table_id, ce qui permet d'abréger la définition du lien, qui est bonne dans ton schéma, juste plus verbeuse.

    Je ne comprend pas comment tu arrives à sortir deux requêtes, jamais vu et tes liens sont bons.

    Essaye de remplacer le execute par un getSqlQuery que tu affiches dans un die().

    Autre chose, dans la deuxième requête (celle avec limit), il y a un "WHERE t.id IN ('1') des plus surprenants. Combien as-tu d'enregistrements dans la table intitulé ?

    J'ai fait des essais similaires et je ne suis pas arrivé à avoir ton résultat.

  11. #11
    Membre éclairé Avatar de Shandler
    Profil pro
    Inscrit en
    Février 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 514
    Par défaut
    J'ai testé avec le die mais il me renvoie la même requête avec le IN et sans le limit

    Sinon le "WHERE t.id IN ('1')" doit généréré par symfony pour indiquer sur qu'elle intituler je travail.

    Je tes mis ci-dessous le fichier de fixture que j'utilise si ca peut aider merci a toi.

    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
     
    intitule:
      tester:
        id_user: 12
        title: the tester
     
      tester2:
        id_user: 16
        title: the tester2
     
    monTexte:
    <?php for ($i = 1; $i <= 30; $i++): ?>
      first_<?php echo $i ?>:         
        intitule: tester
        page_contenu: | 
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non dolor id eros vestibulum congue. Praesent dignissim lobortis sem, ut accumsan lectus facilisis aliquet. Mauris et tellus vitae mi varius pellentesque. Vivamus id elementum mi. Mauris condimentum convallis lacus vitae fermentum. Suspendisse lobortis tortor arcu. Quisque scelerisque rutrum eros. Duis felis ipsum, congue vel interdum vitae, tristique sit amet eros. Phasellus in magna porta tellus ullamcorper consectetur quis eget mauris. Fusce blandit leo eu urna blandit vulputate. In quis metus tortor, nec sagittis neque. In sodales lorem quis orci adipiscing commodo. Donec quis sem egestas quam sollicitudin consequat non at dui. Aliquam et luctus justo. Maecenas hendrerit tristique metus, nec egestas diam adipiscing sit amet.
            Fusce eu dui eget quam porttitor porttitor. Sed vel mauris enim. Etiam nec convallis leo. Nam ornare adipiscing rutrum. Etiam porta arcu ac turpis tristique eget ornare orci iaculis. Vestibulum sit amet lorem ut magna tempor mattis. Praesent nulla libero, rutrum eget lobortis sed, blandit non nulla. Aenean accumsan fringilla suscipit. Donec bibendum, leo sit amet condimentum posuere, risus justo congue orci, non fermentum sem risus ac ipsum. Fusce sit amet leo in orci pellentesque mollis. Etiam imperdiet, elit et pellentesque semper, nunc sem suscipit ipsum, at sodales ante mi et erat.
            Pellentesque consequat, elit a sagittis dapibus, eros eros feugiat est, nec tempor est turpis in ante. Ut id nisl enim. Morbi auctor rhoncus urna, non ornare eros bibendum ut. Etiam lacus sapien, blandit sit amet scelerisque vitae, dictum a ligula. Praesent facilisis vestibulum nibh a aliquet. Fusce nec tempus eros. Sed porttitor elit eget urna venenatis facilisis. Ut sed massa arcu, id suscipit lectus. Aenean nulla nisl, tristique eget auctor et, cursus nec ligula. Etiam nulla dolor, mattis at scelerisque non, volutpat eu erat. Nam tellus purus, lobortis eleifend tempus at, pulvinar et lectus. Morbi tortor ante, fermentum at iaculis vitae, fringilla vitae metus. Pellentesque convallis blandit eros, vel porttitor tortor dignissim in.
        num_page: <?php echo $i ?>
     
    <?php endfor ?>
     
    <?php for ($i = 1; $i <= 30; $i++): ?>
      second_<?php echo $i ?>:         
        intitule: tester2
        page_contenu: | 
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non dolor id eros vestibulum congue. Praesent dignissim lobortis sem, ut accumsan lectus facilisis aliquet. Mauris et tellus vitae mi varius pellentesque. Vivamus id elementum mi. Mauris condimentum convallis lacus vitae fermentum. Suspendisse lobortis tortor arcu. Quisque scelerisque rutrum eros. Duis felis ipsum, congue vel interdum vitae, tristique sit amet eros. Phasellus in magna porta tellus ullamcorper consectetur quis eget mauris. Fusce blandit leo eu urna blandit vulputate. In quis metus tortor, nec sagittis neque. In sodales lorem quis orci adipiscing commodo. Donec quis sem egestas quam sollicitudin consequat non at dui. Aliquam et luctus justo. Maecenas hendrerit tristique metus, nec egestas diam adipiscing sit amet.
            Fusce eu dui eget quam porttitor porttitor. Sed vel mauris enim. Etiam nec convallis leo. Nam ornare adipiscing rutrum. Etiam porta arcu ac turpis tristique eget ornare orci iaculis. Vestibulum sit amet lorem ut magna tempor mattis. Praesent nulla libero, rutrum eget lobortis sed, blandit non nulla. Aenean accumsan fringilla suscipit. Donec bibendum, leo sit amet condimentum posuere, risus justo congue orci, non fermentum sem risus ac ipsum. Fusce sit amet leo in orci pellentesque mollis. Etiam imperdiet, elit et pellentesque semper, nunc sem suscipit ipsum, at sodales ante mi et erat.
            Pellentesque consequat, elit a sagittis dapibus, eros eros feugiat est, nec tempor est turpis in ante. Ut id nisl enim. Morbi auctor rhoncus urna, non ornare eros bibendum ut. Etiam lacus sapien, blandit sit amet scelerisque vitae, dictum a ligula. Praesent facilisis vestibulum nibh a aliquet. Fusce nec tempus eros. Sed porttitor elit eget urna venenatis facilisis. Ut sed massa arcu, id suscipit lectus. Aenean nulla nisl, tristique eget auctor et, cursus nec ligula. Etiam nulla dolor, mattis at scelerisque non, volutpat eu erat. Nam tellus purus, lobortis eleifend tempus at, pulvinar et lectus. Morbi tortor ante, fermentum at iaculis vitae, fringilla vitae metus. Pellentesque convallis blandit eros, vel porttitor tortor dignissim in.
        num_page: <?php echo $i ?>
     
    <?php endfor ?>

  12. #12
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    J'ai refais des tests sur des bases à moi, mais sans problèmes, je n'arrive pas à reproduire le problème. Et je ne vois aucune raison pour qu'il existe.

    D'où viennent les id_user ?

  13. #13
    Membre éclairé Avatar de Shandler
    Profil pro
    Inscrit en
    Février 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 514
    Par défaut
    Pour l'instant l'id_user ne sert pas, son utilité viendra aprés quand j'aurais créé l'admin et la gestion des utilisateurs.

    Je vais te décrire ce que j'ai fais moi, donc j'ai créé un module.

    Dans action.class.php a executeIndex() jai mis la requete ci-dessous ce qui me permet de cree des liens pour atteindre la page ou je dois utiliser la requete qui me pose probléme d'ou l'id In qui est rajouter.

    $this->intitules = Doctrine::getTable('Intitule')
    ->createQuery('a')
    ->execute();

  14. #14
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Essaie de supprimer tous les fichiers dans lib/model/doctrine

    Puis refait un build --all

  15. #15
    Membre éclairé Avatar de Shandler
    Profil pro
    Inscrit en
    Février 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 514
    Par défaut
    J'ai tous supprimer et rebuild mais toujours le même problème je voie vraiment pas ce qui bloque.

    Est ce que le problème viendrais que j'utilise symfony via wamp ?

  16. #16
    Membre éclairé Avatar de Shandler
    Profil pro
    Inscrit en
    Février 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 514
    Par défaut
    Bonjour,

    Je reviens vers toi pour te tenir au courant de mes avancés, alors jai recommencer un projet vierge en faisant juste ce que jai besoin et le problème persiste, je n'y comprend plus rien.

    Serait-il possible que tu me donne les sources ou tu dis que pour toi sa fonctionne ?

    Merci a toi

  17. #17
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Donne moi le fixature utilisé pour ton test et le shema.yml.

    J'ai un peu de temps ce week-end, je vais tester de mon côté.

  18. #18
    Membre éclairé Avatar de Shandler
    Profil pro
    Inscrit en
    Février 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 514
    Par défaut
    Merci pour ton aide et ton temps.
    Je te joins les 2 fichiers comme tu m'as demandé, j'ai remplacé le .yml par .txt

    Merci a toi
    Fichiers attachés Fichiers attachés

  19. #19
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    J'ai testé et ... j'ai compris.

    En fait, je n'ai jamais travaillé, avec limite, que sur une table à la fois. Hors, ici, tu travailles sur une table et une relation.

    De ce que j'ai compris de la méthode ->limite() de doctrine c'est qu'elle ne porte que sur la table principale. Ce qui explique les deux requêtes. La première récupère les x premiers enregistrements de la table principale, la deuxième récupère le reste des informations avec un "id IN ..." pour ne récupérer que ce qui correspond au deuxième enregistrement.

    Et en effet, c'est logique comme raisonnement.

  20. #20
    Membre éclairé Avatar de Shandler
    Profil pro
    Inscrit en
    Février 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 514
    Par défaut
    Merci beaucoup pour ton aide est c'est vrai que ca logique.

    Je voulais te poser une dernière question, pour donc faire ma limit tu me conseil de faire 2 requête sachant que ma limite doit être sur la table monTexte.

    Merci a toi

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [2.x] requete avec doctrine
    Par noobie59 dans le forum Symfony
    Réponses: 1
    Dernier message: 11/09/2013, 00h30
  2. Réponses: 1
    Dernier message: 29/06/2010, 16h58
  3. Probleme de date dans requete avec access
    Par pbauquel dans le forum Accès aux données
    Réponses: 2
    Dernier message: 29/04/2009, 12h58
  4. Réponses: 3
    Dernier message: 03/05/2008, 17h44
  5. Cumul de valeur dans requete avec date
    Par OtObOx dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/07/2007, 18h07

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