Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/12/2010, 13h00   #1
Invité de passage
 
Inscription : décembre 2006
Messages : 10
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 10
Points : 0
Points : 0
Par défaut requete particulière avec Propel

Bonjour,
Je cherche à modifier l'ordre des jointures dans une requete générée par Propel
Voici la structure de ma base

Citation:
tableFAMILLE [ id, name ]
tableMEMBRE [ id, famille_id, name ]
tableBIDON [ id ]
une requete, simple, me permettant de récupérer les membres d'une famille serait

Citation:
select * from famille, membre where membre.famille_id = famille.id and famille.id = 4
J'ai pris l'habitude d'écrire ce genre de requete ainsi (pour limiter le nombre de tuples traitées par la requete SQL) :

Citation:
select * from famille join membre on (membre.famille_id=famille.id and famille.id=4)
Pour aller encore plus loin, j'utilise une table BIDON et qui ne contient qu'un seul enregistrement.
Cela me permet d'écrire (et d'optimiser) ma requête ainsi :

Citation:
select * from bidon
join famille on (famille.id=4)
join membre on (membre.famille_id = famille.id)
J'aimerais traduire cette requete avec Propel, pour récupérer une liste de membres.
Je peux tenter un :

Citation:
$c = new Criteria();
$c->addJoin( BidonPeer::ID, FamillePeer::ID, Criteria::JOIN );
$c->addJoin( MembrePeer::FAMILLE_ID, FamillePeer::ID, Criteria::JOIN );
MembrePeer::doSelect($c)
Mais la requete générée ne ressemble pas à ma requete 'idéale'
Comment puis je obtenir ma requête 'optimisée' ?

L'étape la plus difficile est, je crois, de faire en sorte que la requete commence par "select * from bidon" alors que l'on veut remonter des 'membres' :
apparement, le fait de faire un MembrePeer::doSelect($c) impose que la requete commence par "select * from membres", ce qui m'emmerde...

Avez vous des idées ?
JC
jcmartin01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 13h01   #2
Invité de passage
 
Inscription : décembre 2006
Messages : 10
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 10
Points : 0
Points : 0
J'ai réussi à avancer un peu. On peut obtenir

Citation:
SELECT * FROM bidon JOIN famille ON (4=famille.ID)
en procédant ainsi :

Citation:
$c=new Criteria();
$c->addJoin(4, FamillePeer::ID, ' bidon'.Criteria::JOIN);
FamillePeer::doSelect($c)
Mais quand je rajoute les membres :

Citation:
$c->addJoin(MembresPeer::FAMILLE_ID, FamillePeer::ID);
ca re-marche-pas, la requete devient

Citation:
select * from membres bidon join famille.....

Si vous trouvez plus vite que moi...
jcmartin01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 14h11   #3
Invité de passage
 
Inscription : décembre 2006
Messages : 10
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 10
Points : 0
Points : 0
je continue à me répondre

Il suffit d'appliquer le meme principe qui consiste à mettre une constante (ou une chaine VUE comme une constante par Propel) en premier parametre du addJoin

ainsi, au lieu d'écrire

Citation:
$c->addJoin(MembresPeer::FAMILLE_ID, FamillePeer::ID);
on écrit

Citation:
$c->addJoin("membres.famille_id", FamillePeer::ID, Criteria::JOIN);
et on obtient la requete que je souhaitais obtenir

Je vais reformuler ma question du coup :

est il possible de faire qq chose de ce style :

Citation:
$sql = "select * from blablabala";
MembresPeer::doSelect($sql);
(une CUSTOM QUERY quoi, il me semble avoir déjà lu des choses sur ce sujet)
Merci de vos réponses si vous trouvez...
jcmartin01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h03.


 
 
 
 
Partenaires

Hébergement Web