Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 24-03-2010 16:49:08

mymt
Membre
Lieu: PACA
Date d'inscription: 25-09-2009
Messages: 93

Problème de champ avec des requêtes sur des jointures

Bonjour à tous..
J'ai décidé de reprogrammer une partie de mes accès à la BDD afin de supprimer des boucles foreach, en programmant correctement (enfin de crois) en utilisant des jointures.

J'ai donc en fait deux classes (et donc 2 tables dans la BDD), dont la corrélation se fait à travers une troisième table. La relation n'est pas de 1 vers 1 mais de 1 vers N.

Bref, mes deux premières classes ont un champ (qui est également la clé primaire) qui s'appelle ID.
Lorsque je récupère le résultats de ma requète et que je la mouline dans un foreach, je fais une lecture des données :

Code:

$compte_id = '25';
$Liste_enregistrement = new Tenregistrement;
$my_select=$Liste_enregistrement ->select() -> from (array("enregistrement"=>"Tenregistrement"))
                -> join(array("enregistrement_compte"=>"TP_Compte_Enregistrement"),
                        "enregistrement_compte.ID_Enregistrement=enregistrement.ID")
                -> join(array("compte"=>"Tcompte"),
                        "compte.ID=enregistrement_compte.ID_Compte")
                -> where('compte.ID=?',$compte_id)
                -> where('enregistrement.status=?','programmee')
                -> order ('enregistrement.dateDeclanchement ASC')
                ->setIntegrityCheck(false);
$activated_enregistrement = $Liste_enregistrement -> fetchAll($my_select);


foreach ($activated_enregistrement as $enregsitrement_current) {
        
    $obj_date = $enregsitrement_current->dateDeclanchement;
        $obj_enregistrement = $enregsitrement_current->ID;
echo "****** # $obj_enregistrement / $obj_date   *****";

}

La où ça craint, c'est que je récupère bien les différentes valeur pour $obj_date (telle que enregistrées dans la BDD) mais pas pour $obj_enregistrement, ou je me récupère en fait 25 soit la valeur de $compte_id (correspondant à la clé primaire de Tcompte)

Je vous avoue que la je coince.... à la rigueur si je n'avais pas la bonne valeur sur les deux champs... mais là seulement 1 sur 2... une idée???

Merci pour votre aide..

Dernière modification par mymt (24-03-2010 17:05:36)

Hors ligne

 

#2 24-03-2010 18:08:41

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Problème de champ avec des requêtes sur des jointures

précise les champs que tu veux remonter car MySQL est un truc bizarre qui parfois ne fais pas exactement ce q'on attend de lui.

dans ton cas je pense que tu ne veux pas toutes les colonnes alors liste pour chaque table jointe celles que tu veux.

Code:

$compte_id = '25';
$Liste_enregistrement = new Tenregistrement;
$my_select=$Liste_enregistrement->select()
  ->from (array("enregistrement"=>"Tenregistrement"), array('dateDeclanchement'))
  -> join(array("enregistrement_compte"=>"TP_Compte_Enregistrement"), "enregistrement_compte.ID_Enregistrement=enregistrement.ID", null)
  -> join(array("compte"=>"Tcompte"), "compte.ID=enregistrement_compte.ID_Compte", array('ID'))
  -> where('compte.ID=?',$compte_id)
  -> where('enregistrement.status=?','programmee')
  -> order ('enregistrement.dateDeclanchement ASC')
  ->setIntegrityCheck(false);
$activated_enregistrement = $Liste_enregistrement -> fetchAll($my_select);


foreach ($activated_enregistrement as $enregsitrement_current) {

    $obj_date = $enregsitrement_current->dateDeclanchement;
        $obj_enregistrement = $enregsitrement_current->ID;
echo "****** # $obj_enregistrement / $obj_date   *****";

vu que compte.ID est restreint à 25 dans le where
$enregsitrement_current->ID doit toujours être à 25

dans la requête que tu as donné vu que tu fais un SELECT *
tu as la colonne ID de enregistrement.ID
la colonne ID de compte.ID

du coup lorsque tu fais $enregsitrement_current->ID tu ne sais pas la quelle des deux il prend

si c'est la colonne enregistrement.ID que tu veux tu mets null pour la jointure sur compte et tu mets ID comme colle à remonter sur l'autre

si tu veux les deux il te faux les nommer

Code:

$compte_id = '25';
$Liste_enregistrement = new Tenregistrement;
$my_select=$Liste_enregistrement->select()
  ->from (array("enregistrement"=>"Tenregistrement"), array('dateDeclanchement'))
  -> join(array("enregistrement_compte"=>"TP_Compte_Enregistrement"), "enregistrement_compte.ID_Enregistrement=enregistrement.ID", array('EnregistrementID' => 'ID'))
  -> join(array("compte"=>"Tcompte"), "compte.ID=enregistrement_compte.ID_Compte", array('CompteID' => 'ID'))
  -> where('compte.ID=?',$compte_id)
  -> where('enregistrement.status=?','programmee')
  -> order ('enregistrement.dateDeclanchement ASC')
  ->setIntegrityCheck(false);
$activated_enregistrement = $Liste_enregistrement -> fetchAll($my_select);


foreach ($activated_enregistrement as $enregsitrement_current) {

echo "****** # $enregsitrement_current->CompteID / $enregsitrement_current->EnregistrementID / $enregsitrement_current->dateDeclanchement   *****";

A+JYT

Hors ligne

 

#3 24-03-2010 22:45:46

mymt
Membre
Lieu: PACA
Date d'inscription: 25-09-2009
Messages: 93

Re: Problème de champ avec des requêtes sur des jointures

Merci pour ton aide... c'est toujours pas très clair pour moi concernant le nommage... pourquoi l'ID de Enregistrement est renomé dans le join??
Si tu as un liens vers une explication de ce genre de truc je suis preneur.

Hors ligne

 

#4 25-03-2010 13:33:41

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Problème de champ avec des requêtes sur des jointures

tu l'as dans le code que je t'ai donné
array('EnregistrementID' => 'ID')
array('CompteID' => 'ID')
et donc dans le for each tu as $enregsitrement_current->EnregistrementID et $enregsitrement_current->CompteID

A+JYT

Hors ligne

 

#5 25-03-2010 15:31:27

mymt
Membre
Lieu: PACA
Date d'inscription: 25-09-2009
Messages: 93

Re: Problème de champ avec des requêtes sur des jointures

Sekaijin,
J'ai bien vue ton code... mais ce que je ne comprends pas (ou pas sur de comprendre) c'est l'endroit où doivent être passé ces commandes (si je prends un autre cas que celui que tu m'as résolu).
Comment lorsque tu fais array('EnregistrementID' => 'ID') on peut être sur que ce sera bien le ID de la table Tenregistrement alors qu'on se situe dans le join ou je parle de la table TP_Compte_Enregistrement?
En fait c'est là que je coince.. en tout cas ou je perds le fil du truc wink

Hors ligne

 

#6 25-03-2010 17:19:08

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Problème de champ avec des requêtes sur des jointures

peu importe la colonne qui pose PB la situation est la suivante

Code:

Table A (
id int,
nom varchar(255),
prenom varchar(255),
date Date
)
Table B (
id int,
a_id, int,
un_champ varchar(255),
deux_champs varchar(255),
date Date
)

tu as deux table avec des colonnes portant des nom identique ici id et date si tu fais une jointure

Code:

SELECT *
FROM A
INNER JOIN B ON (A.id=B.a_id)

tu vas obtenir les colonnes
id, nom, prenom, date, id, a_id, un_champ, deux_champs, date
tu as donc deux fois id et deux fois date

la première chose à faire c'est de ne pas utiliser * et de ne remonter que les champs necessaires

Code:

SELECT
   A.id, nom, prenom, A.date,
   B.id, un_champ, deux_champs, B.date
FROM A
INNER JOIN B ON (A.id=B.a_id)

le champs a_id étant dans la jointure il n'a pas à apparaitre deux fois dans le résultat mais si tu exécute ça ça marche pas à cause de id et date qui y sont deux fois il te faut alors ses alias

Code:

SELECT
   A.id AS id_a, nom, prenom, A.date AS date_a,
   B.id AS ib_b, un_champ, deux_champs, B.date AS date_b
FROM A
INNER JOIN B ON (A.id=B.a_id)

et tour rentre dans l'ordre.

Avec ZF lorsque tu écrit ta requête un ne sais pas quels champs seront en premier ou en dernier si un même nom de champs est présent plusieurs fois (pas de champs spécifiés) un seul des deux champs portant le même nom sera remonté mais tu ne sais pas lequel

Code:

$db->select()
->from('A')
->join('B', 'A.id=B.a_id')

vas te donner les colonnes
nom, prenom, a_id, un_champ, deux_champs, id, date
Mais quel id et quelle date ? impossible à prévoir

Code:

$db->select()
->from('A',array('id', 'nom', 'prenom', 'date'))
->join('B', 'A.id=B.a_id',array('id', 'un_champ', 'deux_champs', 'date'))

la encore tu as les champs
nom, prenom, a_id, un_champ, deux_champs, id, date
Mais encore une fois quel id et quelle date ? impossible à prévoir

la solution les alias:

Code:

$db->select()
->from('A',array(
  'id_a' => 'id',
  'nom',
  'prenom',
  'date_a' => 'date'))
->join('B', 'A.id=B.a_id',array(
  'id_b' => 'id',
  'un_champ',
  'deux_champs',
  'date_b' => 'date'))

cette fois tu obtiens les colonnes
nom, prenom, a_id, un_champ, deux_champs, id_a, date_a, id_b, date_b

il n'y a plus d'Ambiguité

tu reparqueras que dans ZF la liste des champs n'est pas unique pour toute la requête comme en SQL

Code:

SELECT
   A.id, nom, prenom, A.date,
   B.id, un_champ, deux_champs, B.date

Mais qu'il y a une liste par source

Code:

$db->select()
->from('A',array(
  'id_a' => 'id',
  'nom',
  'prenom',
  'date_a' => 'date'))

et

Code:

->join('B', 'A.id=B.a_id',array(
  'id_b' => 'id',
  'un_champ',
  'deux_champs',
  'date_b' => 'date'))

Les champs sont ceux de la table que tu traite il ne peut donc pas y avoir de pb
A+JYT

Hors ligne

 

#7 26-03-2010 10:50:15

mymt
Membre
Lieu: PACA
Date d'inscription: 25-09-2009
Messages: 93

Re: Problème de champ avec des requêtes sur des jointures

Super explication!!! Merci beaucoup!!! Je crois que je comprenais les jointures de travers. C'est maitnenant nettement plus clair pour moi.
Je vais tâcher de répliquer ça à mes différents cas wink

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages