Quick links: Content - sections - sub sections
EN FR
Quick Search Advanced search
 
Page

  [Opened] DAO et jointures

Posted by Guest on 09/05/2006 22:50

Bonjour,

Est-il possible de faire une requête du type:

  select ... from a, b, c where a.id = b.aid and b.cid = c.id

en utilisant les DAO?

  [Opened] Re: DAO et jointures

Reply #1 Posted by laurentj on 09/06/2006 10:06

non.

  [Opened] Re: DAO et jointures

Reply #2 Posted by MrSlayers on 09/06/2006 13:05

Bonjour,

Je dois dire que je suis tres etonné !

Comment cela se fait t'il alors que l'on puisse faire un foreignkey qui donne en resultat un LEFT JOIN ? Je veux dire, que le LEFT JOIN est supporté avant une jointure "normale" (alors que pour moi le LEFT JOIN n'est pas une jointure normale ^^ )

  [Opened] Re: DAO et jointures

Reply #3 Posted by laurentj on 09/06/2006 13:32

MrSlayers : je ne comprend pas la question. Guillaume ne parle pas de jointure externe ou de jointure simple, mais de l'utilisation d'une table de jointure (utilisée donc pour joindre deux tables)

  [Opened] Re: DAO et jointures

Reply #4 Posted by nORKy on 09/07/2006 18:22

Ce que guillaume à ecrit peut se faire comme : Select * from a LEFT INNER JOIN b on b.aid = a.id LEFT INNER JOIN c on c.id = b.cid non ?

  [Opened] Re: DAO et jointures

Reply #5 Posted by laurentj on 09/08/2006 11:02

Norky : oui, mais ça n'empèche que jDao ne sait pas génerer ce genre de jointures : table a-> table b -> table c. On ne peut avoir que table a-> table b, table a -> table c.

  [Opened] Re: DAO et jointures

Reply #6 Posted by nORKy on 09/09/2006 19:25

?? j'ai du mal à suivre, a partir du moment ou tu sais écrirs LEFT|RIGHT INNER|OUTER JOIN bildule ON machin=truc tu sais faire des jointures comme tu veux... Ou pt etre que je ne visualise pas tous les cas de jointures possibles..

  [Opened] Re: DAO et jointures

Reply #7 Posted by laurentj on 09/10/2006 22:29

Je n'ai pas dit que ce n'était pas impossible, mais que ce n'était pas implémenté.

Actuellement, nous pouvons travailler sur des tables principales qui possèdent des clés étrangères. Si on veut prendre en charge un dao qui s'appuie sur une table de liaison, cela veut dire qu'il faut gérer des listes sur des propriétés (en effet, les clés étrangères ne sont pas sur la table principale). C'est alors une toute autre histoire, et bien plus compliqué à implémenter. Pas infaisable, mais compliqué. Je n'ai pas encore eu le temps de développer ça.

Ceci dit, on peut faire un dao sur la table de liaison. (la table b dans mon exemple). Mais on ne pourra pas alors modifier des trucs sur la table a et la table c. Pour ça, il faut faire des daos sur a et sur c.

  [Opened] Re: DAO et jointures

Reply #8 Posted by MrSlayers on 09/11/2006 09:13

Ah d'accord ! Je n'avais pas compris qu'il y avait une table de liaison.

  [Opened] Re: DAO et jointures

Reply #9 Posted by sylvain261 on 04/04/2007 19:18

Je pense qu'il est possible de permettre à JDao de faire une jointure du type

 select ... from a, b, c where a.id = b.aid and b.cid = c.id

Pour cela une solution serait de modifier la méthode _getFromClause de jDaoGenerator afin que dans la clause where on ne force pas le prefixe de la table si celui ci est déjà défini.

Dans mon cas j'ai fait ça de la façon suivante : J'ai remplacé le code :

 foreach($table['fk'] as $k => $fk){
 $sqlWhere.=' AND '.$primarytable['name'].'.'.$fk.'='.$table['name'].'.'.$table['pk'][$k];
 }

par

 foreach($table['fk'] as $k => $fk){
 if((strpos($fk, '.')===FALSE)){
 $fk=$primarytable['name'].'.'.$fk;
 }
 $sqlWhere.=' AND '.$fk.'='.$table['name'].'.'.$table['pk'][$k];
 }

Et j'obtiens bien le résultat souhaité si dans mon DAO je met qqch du genre (mes champs sont préfixés du nom de la table) :

 <primarytable name="A" realname="A" primarykey="A_id" />
 <foreigntable name="B" realname="B" primarykey="B_id" onforeignkey="A_B_id" />
 <foreigntable name="C" realname="C" primarykey="C_id" onforeignkey="B.B_A_id" />

Bien sur cela ne concerne que les select et pas les mise à jour mais c'est bien ce dont j'ai besoin. Qqch de similaire est à faire pour les outer join.

 
Page
  1. DAO et jointures