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 :

Requete multitables avec relation pas dans le schéma


Sujet :

ORM PHP

  1. #1
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut Requete multitables avec relation pas dans le schéma
    voila j'ai besoin de comparé une donnée dans une table qui varie tout les mois (la taille d'une boite mail).
    mon schéma:
    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
     
    email:
      columns:
        datestate: date
        asset_id: integer
        specialaccount: string(50)
        total: integer
        billable_euro: float(2)
        billable_act: float(2)
        snapshot_annual_act: float(2)
        billable_adj: float(2)
        snapshot_annual_adj: float(2)
      indexes:
        unique:
          fields: [datestate, asset_id]
          type: unique
      relations:
        Asset:
          local: asset_id
          foreign: id
          foreignAlias: monthlydiskspaceln
    le but est de savoir chaque mois qui a le plus fait un travail de réduction de sa boite.

    la requete SQL donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT e.asset_id, e.total,f.total,e.total-f.total
    FROM email e
    LEFT JOIN email f ON e.asset_id=f.asset_id AND f.datestate="2010-11-01"
    WHERE e.datestate="2010-12-01"
    ORDER BY e.total-f.total;
    ce que j'ai transcrit en DSL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $q = $this->createQuery()
                    ->select('e.id, e.asset_id,e.total,f.total')
                    ->from('email e')
                    ->leftJoin('email f ON e.asset_id = f.asset_id AND f.datestate="'.$prevdate.'"')
                    ->where('e.datestate= ? ',$date)
                    ->orderBy('(e.total-f.total)');
    sauf que ça me donne comme requete (via echo $q->getSqlQuery()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT e.id AS e__id, e.asset_id AS e__asset_id, e.total AS e__total, e2.id AS e2__id, e2.total AS e2__total FROM email e, email e2 WHERE (e.datestate = ?) ORDER BY (e.total-e2.total)
    et au $q->execute() le message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "email" with an alias of "f" in your query does not reference the parent component it is related to.
    je ne voie pas trop comme me dépatouiller de ça

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $q = $this->createQuery()
                    ->select('e.id, e.asset_id,e.total,f.total')
                    ->from('email e, email f')
                    ->andWhere('e.asset_id = f.asset_id')
                    ->andWhere('f.datestate= ? ', $prevdate )
                    ->andWhere('e.datestate= ? ',$date)
                    ->orderBy('(e.total-f.total)');
    C'est moins beau qu'avec la condition de lien dans le leftloin mais cela devrait marcher, je pense. Non testé.

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut
    j'avais déjà tester.
    Si la query créé est correct:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT e.id AS e__id, e.asset_id AS e__asset_id, e.total AS e__total, e2.id AS e2__id, e2.total AS e2__total FROM email e, email e2 WHERE (e.asset_id = e2.asset_id AND e2.datestate = ? AND e.datestate = ?) ORDER BY (e.total-e2.total)
    j'ai toujours le message d'erreur lors de l'exécution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "email" with an alias of "f" in your query does not reference the parent component it is related to.

  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
    Parfois faut essayer d'être plus bête que lui...

    et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $q = $this->createQuery()
                    ->select('e.id, e.asset_id,e.total,f.total')
                    ->from('email e, email e2')
                    ->andWhere('e.asset_id = e2.asset_id')
                    ->andWhere('e2.datestate= ? ', $prevdate )
                    ->andWhere('e.datestate= ? ',$date)
                    ->orderBy('(e.total-e2.total)');
    ca donne quoi ?

  5. #5
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut
    même punition.
    J'ai l'impression que doctrine n'accepte de lié des tables que si elles ont une relation dans le schéma !!!

  6. #6
    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
    Même message d'erreur ?

    Ce n'est pas possible, il n'y a plus de "f" dans la requête.

  7. #7
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut
    lol même message d'erreur avec e2 au lieu du f.
    ça sent le roussi

  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
    Je suis (presque) sur d'avoir déjà vu ce problème d'ouverture d'une table en double sur dvp. impossible de retrouver la discutions

    Je tâche de penser a jeter les deux yeux demain, je n'en ai jeté qu'un ce soir

  9. #9
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut
    bon j'ai tenté avec un rawSQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $q = new Doctrine_RawSql();
            $q->select('{e.*}, {e2.*}')
                    ->from('email e')
                    ->leftJoin('email e2 ON e2.asset_id=e.asset_id')
                    ->where('e.datestate= ?',$date)
                    ->andWhere('e2.datestate=?', $prevdate)
                    ->addComponent('e','email')
                    ->addComponent('e2','email')
                    ;
    en reprenant l'exemple ici

    ça marche pas non plus, message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The associated component for table alias e2 couldn't be found.
    autre tentative:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $queryRaw='SELECT e.assey_id, e.total, e1.total
                FROM email e
                LEFT INNER JOIN email e1 ON e.asset_id=e1.asset_id
                WHERE e.datestate="'.$date.'" AND e1.datestate="'.$prevdate.'"';
     
            $query = Doctrine_Query::create()
                ->query($queryRaw);
     
          $result = $query->toArray();
     
          $count = count($result);
          echo $count;
    de nouveau:
    je m'arrache les cheveux la.

  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
    Cela ne peut pas marcher avec la méthode leftJoin(). En effet, celle-ci bien que ressemblant au LEFTJOIN de SQL en est très différente. Elle permet de charger une table liée dans le schéma. Si tu tentes de l'utiliser avec une table non liée, tu ne peux qu'avoir des erreurs.

    Il faut faire à l'ancienne, toutes les tables dans from et les conditions dans where.

    Si non, il te reste la possibilité d'envoyer directement une requête sql sans passer par du DQL. Pas portable, mais parfois...

  11. #11
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut
    on a essaye michel et ça ne marche pas.

    PS: j'ai rajouté d'autre test, qui ne fonctionne pas non plus dans mon post précédent.

  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
    Essaye un truc dans le genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $q = new Doctrine_RawSql();
            $q->select('{e.*}, {e2.*}')
                    ->from('email e LEFT JOIN email e2 ON e2.asset_id=e.asset_id')
                    ->where('e.datestate= ?',$date)
                    ->andWhere('e2.datestate=?', $prevdate)
                    ->addComponent('e','email')
                    ->addComponent('e2','e.emails e2')
                    ;
    après, il y a les componment pour lesquels j'ai des doutes.

    Note que le code, bien que ressemblant au tiens est modifié

  13. #13
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut
    résultat des test:
    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->addComponent('e2','e.emails e2')
    j' ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Call to a member function evictAll() on a non-object in C:\wamp\www\lib\vendor\symfony\lib\plugins\sfDoctrinePlugin\lib\vendor\doctrine\Doctrine\Connection.php on line 1239
    et
    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->addComponent('e2','emails e2')
    j' ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Call to a member function evictAll() on a non-object in C:\wamp\www\lib\vendor\symfony\lib\plugins\sfDoctrinePlugin\lib\vendor\doctrine\Doctrine\Connection.php on line 1239
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Couldn't find class emails
    bon ce qui me surprend pas, j'ai donc modifié en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->addComponent('e2','email e2')
    ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Call to a member function evictAll() on a non-object in C:\wamp\www\lib\vendor\symfony\lib\plugins\sfDoctrinePlugin\lib\vendor\doctrine\Doctrine\Connection.php on line 1239
    et:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The associated component for table alias e2 couldn't be found.
    j'ai aussi teste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     $q->select('{e.*}, {e2.*}')
                    ->from('email e LEFT JOIN email e2 ON e2.asset_id=e.asset_id')
                    ->Where('e.datestate= ?',$date)
                    ->andWhere('e2.datestate=?', $prevdate)
                    ->addComponent('e','email')
                    ->addComponent('e2','email')
                    ;
    ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Call to a member function evictAll() on a non-object in C:\wamp\www\lib\vendor\symfony\lib\plugins\sfDoctrinePlugin\lib\vendor\doctrine\Doctrine\Connection.php on line 1239
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The associated component for table alias e2 couldn't be found.
    si quelqu'un pouvait tester ce petit code sur une de ces tables pour voir si ça viendrait pas de ma version.
    J'ai du mal à croire que Doctrine ne sache pas gérer des relations dans les requêtes non prévues dans le schéma.

    Sinon michel y a t il moyen d'outrepassé Doctrine pour exécuter une requête.
    en attendant de voir si Doctrine sait faire, ça me permettra de validé la poursuite de mon projet. Parce que sinon c'est 3 mois de boulot à la poubelle

  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
    Tu as la méthode "barbare de niveau 2". En court-circuitant complètement doctrine.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $con = Doctrine_Manager::getInstance()->connection();
    $datas= $con->execute('SELECT ... FROM ...'); // du SQL vrai et dur
    $retours = $datas->fetchAll();
    Qui te retourne un array avec les résultats. A toi d'exploiter. Jamais eu besoin de tester en vrai, mais je crois avoir jouer avec il y a un bon bout de temps, impossible de me rappeler si cela marchait ou pas.

  15. #15
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut
    cool ça marche.

    Bon je laisse en non résolu des fois qu'on arrive a trouver une solution plus "doctrinal".
    D'ailleurs tu aurait des sites de vulgarisation de Doctrine.
    A part le site de Doctrine lui même qui est un peu léger dés que tu sort un peu des relations habituels.

  16. #16
    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
    Non.

    Hors Google et l'espoir de trouver quelque chose.

    On a un projet de wiki sur developpez autour de Symfony 2 et Doctrine 2 (on commence par du nouveau) donc si tu es intéressé à participé, sonne moi.

  17. #17
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut
    j'ai encore un bout de chemin je pense

    mais disons que j'essaye toujours de faire un post sur un sujet généraliste, du moins je le croit.

  18. #18
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut
    désolé de réveiller un vieux post mais je pense que cela vaille le coup.
    Malgré mes recherche je n'ai toujours pas trouvé comment faire une requête DQL en ayant deux fois la même table.
    Il y a moyen de poser directement la question au créateur de symfony ?

  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
    Il faudrait plutôt poster, en anglais, sur la mailling list de doctrine.

  20. #20
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Par défaut
    arf moi et l'anglais :/

Discussions similaires

  1. des requetes sql avec vb.net dans asp.net
    Par fishingman dans le forum ASP.NET
    Réponses: 1
    Dernier message: 06/05/2010, 21h45
  2. Requete php avec attribut sélectionné dans liste
    Par drogba72 dans le forum Langage
    Réponses: 7
    Dernier message: 20/02/2009, 09h39
  3. requete sql avec une condition dans une zone de liste
    Par khilim1 dans le forum VBA Access
    Réponses: 2
    Dernier message: 30/12/2008, 12h00
  4. requete SQL avec where dynamique dans une servlet
    Par Mickael Scofild dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 12/08/2007, 12h05
  5. [PL/SQL] requete qui marche mais pas dans un cursor
    Par victor.ward dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/09/2005, 22h21

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