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 :

recuperation data sur une query complexe


Sujet :

ORM PHP

  1. #21
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Points : 178
    Points
    178
    Par défaut
    si si, j'ai juste supprimé la référence à la table supplémentaire et le addSelect qui y était lié.

  2. #22
    Membre éclairé Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Points : 816
    Points
    816
    Par défaut
    si tu vois dans ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $q=$this->createQuery('a')
                    ->select('a.*,sf.*,se.*,ga.id,a1.*,hi1.*')
                    ->addSelect('hi2.total as prevtotal')
                    ->leftJoin('a.users sf')
                    ->leftJoin('sf.Costcenter se')
                    ->leftJoin('sf.groupassets ga')
                    ->leftJoin('ga.listGroupAsset a1 ON a1.groupasset_id=ga.id AND a1.type="email"')
                    ->innerJoin('a1.historic hi1 ON hi1.asset_id=a1.id AND hi1.datestate="'.$datelimit.'"')
                    ->leftJoin('a1.historic hi2 ON hi2.asset_id=a1.id AND hi2.datestate="'.$predate.'"')
                    ->where('a.id=?',$site->getId())
                    ->andWhere('sf.is_active=true')                
                    ->orderBy('se.business, se.name, sf.last_name, sf.first_name')
    ce que tu as écrit ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Doctrine_core::getTable('email_diskspace')->findOneByAssetIdAndDatestate($asset->getId(), $prevDate);
    Je veux bien que tu me le montre.
    En plus la tu as exactement les meme jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ->innerJoin('a1.historic hi1 ON hi1.asset_id=a1.id AND hi1.datestate="'.$datelimit.'"')
    ->leftJoin('a1.historic hi2 ON hi2.asset_id=a1.id AND hi2.datestate="'.$predate.'"')
    Pour une écriture plus lisible tu devrais mettre les and dans le where.

  3. #23
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Points : 178
    Points
    178
    Par défaut
    la relation a1.historic hi2 correspond a la relation entre la table asset et la table email_diskspace:


    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    asset:
      tableName: asset
      actAs: [Timestampable]
      columns:
        type: string(50)
        value: string(255)
        groupasset_id: integer
        etat: string(50)
        action: string(50)
        chargebycsc: boolean
        in_use: boolean
        lastview: date
      indexes:
        unique1:
          fields: [type,value,groupasset_id]
          type: unique
        valueindex:
          fields: [value]
        lastview:
          fields:
            lastview:
              sorting: DESC
      relations:
        group:
          class: groupasset
          local: groupasset_id
          foreign: id
          foreignAlias: listGroupAsset
          onDelete: SET NULL
     
    email_diskspace:
      columns:
        datestate: date
        asset_id: integer
        specialaccount: string(50)
        total: integer
        billable_euro: float(5,2)
        billable_act: float(5,2)
        snapshot_annual_act: float(7,2)
        billable_adj: float(5,2)
        snapshot_annual_adj: float(7,2)
      indexes:
        unique:
          fields: [datestate, asset_id]
          type: unique
      relations:
        asset:
          class: asset
          local: asset_id
          foreign: id
          foreignAlias: historic
    et pour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ->innerJoin('a1.historic hi1 ON hi1.asset_id=a1.id AND hi1.datestate="'.$datelimit.'"')
    ->leftJoin('a1.historic hi2 ON hi2.asset_id=a1.id AND hi2.datestate="'.$predate.'"')
    ce n'est pas la même jointure puisque $datelimit (=mois en cours) et $predate(mois précédent) ne sont pas les même
    Et si je met le critere dans le leftjoin et non dans le where c'est que j'ai besoin d'avoir la ligne même si pas de données dans cette table.

  4. #24
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Points : 178
    Points
    178
    Par défaut
    bon je me permet de relancer cette discussion vu que ce n'est toujours pas résolue et que je traine ce problème sur pas mal de requête.
    J'ai une nouvelle requete pas franchement compliqué:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $q=Doctrine_Core::getTable('sfGuardUser')->createQuery('sf')
                    ->select('cc.business as activite, a.special as special, count(a.id) as count')
                    ->leftJoin('sf.Costcenter cc')
                    ->leftJoin('sf.groupassets g')
                    ->leftJoin('g.listGroupAsset a ON a.groupasset_id=g.id AND a.type="RAS MP" AND a.in_use=true')
                    ->where('sf.is_active=true AND sf.site_id=12')
                    ->groupBy('cc.business, a.special')
                    ;
    qui me donne cet SQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT c.business AS c__0, a.special AS a__1, COUNT(a.id) AS a__2 FROM sf_guard_user s LEFT JOIN costcenter c ON s.costcenter_id = c.id LEFT JOIN groupasset g ON s.id = g.user_id LEFT JOIN asset a ON ((a.groupasset_id = g.id AND a.type = "RAS MP" AND a.in_use = 1)) WHERE (s.is_active = 1 AND s.site_id = 12) GROUP BY c.business, a.special
    la pas de souci tout fonctionne.
    ce que je désire est pas compliqué, puisque que au minimum je veut un truc du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach ($data as $line)
    {
      echo $line['business'].' '.$line['special'].' '.$line['count'].'<br>';
    }
    quelqu'un a t il une idée de l'hydratation que je doit faire pour l'obtenir

  5. #25
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    J'avoue que ta question me laisse perplexe car chez moi, avec Doctrine 1.2 + sf 1.4, une requête similaire ne fonctionnera pas : la requête est créé sur la table sfGuardUser mais aucun champ de cette table ne figure dans le select et ça contrarie Doctrine qui lance une exception. Comment fais-tu pour que ta requête soit acceptée ????

    J'ai aussi peut-être raté une étape dans ta problématique mais... si tu rédiges tes requêtes à la main sans passer par les câblages de Doctrine, pourquoi ne pas le faire jusqu'au bout en attaquant directement la couche PDO qui est sous Doctrine ? Par exemple (requête bidon, je te laisse adapter à ton cas) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	$statement = Doctrine_Manager::getInstance()->connection();
    	$results = $statement->execute("SELECT sf.*, cc.* FROM sf_guard_user sf LEFT JOIN sf_guard_user_profile cc ON cc.user_id = sf.id");
    	$coll = $results->fetchAll(Doctrine_Core::FETCH_ASSOC);
    	foreach($coll as $row) {
    	    $profile = $row['phone_number'];
    	}

  6. #26
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    Il est possible que la différence de réponse entre vous deux soit liée à une différence dans la structure du schéma de la base...
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  7. #27
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 534
    Points : 178
    Points
    178
    Par défaut
    effectivement concernant ma requete j'aurai pu ne pas partir de sfGuardUser mais plutot de ma table asset, ce qui m'aurait permis de ne pas surcharger ma relation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->leftJoin('g.listGroupAsset a ON a.groupasset_id=g.id AND a.type="RAS MP" AND a.in_use=true')
    et faire un leftJoin inversé.
    Mais le souci de l'hydratation reste entier

Discussions similaires

  1. Bloc basé sur une vue complexe
    Par tommy_f dans le forum Forms
    Réponses: 9
    Dernier message: 19/03/2008, 14h10
  2. recuperer selection sur une liste deroulante
    Par skillipo dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 18/02/2008, 09h17
  3. Recuperation data d'une liste
    Par insa59 dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 09/03/2007, 15h08
  4. Réponses: 1
    Dernier message: 19/02/2007, 12h45
  5. Update Sql sur une Query Filtré
    Par Soulama dans le forum Bases de données
    Réponses: 4
    Dernier message: 26/10/2006, 14h47

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