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

  [Opened] Methodes DAO et Postgresql

Posted by info2012 on 07/12/2011 15:05

Bonjour,

Sous postgresql , j'ai actuellement deux tables:

CREATE TABLE users (
<code>
    id_user integer DEFAULT nextval('users_id_user_seq'::regclass) NOT NULL,
    login_user character varying(200),
    passe_user character varying,
    nom_user character varying(200),
    prenom_user character varying(200),
    mail_user character varying(200),
    tel_user character(10),
    fax_user character(10),
    droit_user character(1),
    cle_labo_user integer,
    CONSTRAINT fax_user_check CHECK (((fax_user)::text ~ '^[0-9]{10,}$'::text)),
    CONSTRAINT tel_user_check CHECK (((tel_user)::text ~ '^[0-9]{10,}$'::text))

);

</code>

et puis:

CREATE TABLE devis (
<code>
    id_devis integer DEFAULT nextval('devis_id_devis_seq'::regclass) NOT NULL,
    numero_devis character varying(200),
    date_devis date,
    montant_devis double precision,
    numero_facture_devis character varying(200),
    nombre_taxon_devis integer,
    objectif_projet_devis text,
    cle_user_devis integer

);

</code>

Mon objectif est d'afficher les devis demandés pour chaque client sans répeter le nom du client. Il faut donc que je fasse deux requetes imbriquées:

SELECT cle_user_devis, nom_user, prenom_user, count(*) as nb_devis
<code>
		FROM devis, users
		WHERE id_user = cle_user_devis
		group by nom_user, prenom_user, cle_user_devis
	
	

SELECT id_devis, numero_devis, date_devis

                FROM users, devis
                WHERE id_user = cle_user_devis
		AND cle_user_devis = 'la_cle_trouvee_ci_dessus"
</code>

Je suppose qu'il faut que je créer des methodes dans le DAO de la table devis, et puis que je récupère les données à partir du controleur via l'objet jDAO en créant des conditions, c'est bien ça?

Par contre je lis dans la doc que la clause GROUP BY ne fonctionne qu'avec mysql? Il faut donc utiliser autre chose dans ce cas précis? Des requetes avec jDB?

Merci beaucoup pour vos réponses.

Bonne journée

  [Opened] Methodes DAO et Postgresql

Reply #1 Posted by foxmask on 07/12/2011 21:35

bonsoir,

oui jDb


@GitHub - Forum HaveFnuBB! powered by Jelix - Le Booster Jelix !

  [Opened] Methodes DAO et Postgresql

Reply #2 Posted by laurentj on 07/13/2011 11:48

Bonjour,

tu peux très bien récupérer tout d'un seul coup avec une jointure simple sans group by. Certes tu récupères les infos du user à chaque ligne, mais ça se gère très facilement pour l'affichage (ou pour tout autre traitement d'ailleurs). Et ça sera à priori moins gourmand en ressource que le fait de faire X requêtes pour chaque user.

Et sinon dans ta deuxième requête, la jointure avec user est totalement inutile.

  [Opened] Methodes DAO et Postgresql

Reply #3 Posted by info2012 on 07/15/2011 10:38

Bonjour,

Merci beaucoup pour vos réponses.

C'est exactement cela que je veux éviter: la répétition des users à chaque ligne. C'est vrai que c'est beaucoup plus sympa de récupérer les infos en gérant le lien entre les deux tables avec le fichier DAO.

Faut que je cherche uniquement au niveau du template ou bien faut il créer une methode au niveau du fichier DAO?

Bonne journée.

  [Opened] Methodes DAO et Postgresql

Reply #4 Posted by laurentj on 07/15/2011 11:26

Quel est le souci de récupérer les infos du user à chaque ligne ? Pourquoi tu veux éviter ?

Ce n'est pas parce que tu récupère les infos à chaque ligne, que dans ton template tu vas avoir ces infos à chaque ligne, si tu fais ce qu'il faut dans ta boucle d'affichage.

  [Opened] Methodes DAO et Postgresql

Reply #5 Posted by info2012 on 07/15/2011 11:50

Oui, c'est exactement ça, j'essaye de ne pas repeter l'affichage des users pour chaque devis.

Et je ne savais pas si il fallait le gérer uniquement au niveau du template. Je suis pas très douée pour utiliser les templates, mais je vais continuer à chercher.

Merci beaucoup.

  [Opened] Methodes DAO et Postgresql

Reply #6 Posted by laurentj on 07/16/2011 15:10

C'est pourtant le B.A.BA de la manipulation d'enregistrements de bases de donnée (que ce soit pour un template ou pour autre chose d'ailleurs).

{assign $currentUser=null}
{foreach $list as $record}
<code>
   {if $currentUser != $record->id_user}
       afficher user
       {assign $currentUser=$record->id_user}
   {/if}
   afficher devis

{/foreach}

</code>

Ìl faut juste faire attention à ce que les enregistrements soient ordonnés en premier lieu sur les users.

  [Opened] Methodes DAO et Postgresql [resolu]

Reply #7 Posted by info2012 on 07/18/2011 09:39

D'accord,

Merci beaucoup!

Je ne sais pas pourquoi j'arrivais à le faire dans le controleur avec jDB mais pas avec les templates.

Je mets le code du controleur et du template, si ça peut etre utile à d'autres personnes?:

  • Controleur:
function index() {
<code>
      $rep = $this->getResponse('html');
      $rep->title = 'Gestion des Devis';
	  
      $tpl = new jTpl();
      $fact = jDao::get('devis~devis');
      $conditions = jDao::createConditions();
      $conditions->addItemOrder('cle_user_devis');
      $liste = $fact->findBy($conditions);
      $record = jDao::createRecord('devis~devis');
     $fact->insert($record);
     $tpl->assign('liste', $liste);

     $rep->body->assign('MAIN', $tpl->fetch('listedevis'));
 
        return $rep;
    }
</code>
  • Template
<table>
{assign $currentUser=null}
{foreach $liste as $record}
<code>
   {if $currentUser != $record->cle_user_devis}
       <tr>
	  <td><h3>{$record->nom_user}</h3></td><td><h3>{$record->prenom_user}</h3></td>
       </tr>
       {assign $currentUser=$record->cle_user_devis}
   {/if}
      <tr>
	<td>{$record->date_devis}</h3><td>{$record->numero_devis}</h3>
     </tr>	

{/foreach}

</table> </code>

Bonne journée.

 
Page
  1. Methodes DAO et Postgresql