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

  [Opened] Lier une table

Posted by djanke on 02/06/2008 15:28

Débutant en Jelix j'essaye de lier deux table entres elle : Dans ma table principale project j'ai les champs :

  id int(10)  
  project_status_type_id 
  manager_person_id 

Dans mon DAO j'ai

 <primarytable name="project" realname="project" primarykey="id" />

et les property

 <property name="id" fieldname="id" datatype="autoincrement"/>        
 <property name="Type" fieldname="project_status_type_id" datatype="int" required="true">
 <property name="Manager" fieldname="manager_person_id" datatype="int" default="">

Je souhaite lier le champ project_status_type_id à la table project_status_type

Structure :

 id  (Clé)
 name 

Et ensuite afficher le name

Je rajoute

 <optionalforeigntable name="ptype" realname="project_status_type" primarykey="id" onforeignkey="project_status_type_id" />

Je modifie la propertie comme suit :

 <property name="Type" fieldname="project_status_type_id" datatype="int" required="true" table="ptype"/>

Jai l'erreur :

 [error 42S22] SQLSTATE[42S22]: Column not found: 1054 Unknown column 'ptype.project_status_type_id' in 'field list' D:\www_dpi\e107\lib\jelix\db\jDbPDOConnection.class.php 136

Est ce que je doit obligatoirement renommer dans la table project_status_type le champ id en project_status_type_id ?

Par la suite je souhaite lier le champ manager_person_id a la table person :

  id (cléprimaire
  first_name 
  last_name 

Et afficher "first_name last_name"

Un peu d'aide Merci !!!

  [Opened] Re: Lier une table

Reply #1 Posted by laurentj on 02/06/2008 15:32

Salut

Jai l'erreur : Unknown column 'ptype.project_status_type_id'

C'est un peu logique. En faisant

 <property name="Type" fieldname="project_status_type_id" datatype="int" required="true" table="ptype"/>

Tu dis qu'il faut aller chercher le champ project_status_type_id **sur la table ptype**, alors qu'il est sur la table project.

D'ailleurs pourquoi veux tu changer cette balise property ? ça va te servir strictement à rien. Si tu veux juste récupérer le nom du type, tu ajoute juste

 <property name="typename" fieldname="name" datatype="string" table="ptype">

  [Opened] Re: Lier une table

Reply #2 Posted by djanke on 02/07/2008 16:33

Merci ca marche par contre quand je rajoute

 <foreigntable name="ptype" realname="project_status_type" primarykey="id" onforeignkey="id" />

Mon template de liste ne m'affiche que les 3 premiers enrgistrements la clé primaire de la table externe id à une cardinalité de troix est ce en rapport ??? avant d'assigner le template j'ai

 $liste = $fact->findAll();

  [Opened] Re:Lier une table

Reply #3 Posted by djanke on 02/08/2008 10:02

En codant mon DAO

 <datasources>
   <primarytable name="project" realname="project" primarykey="id" />        
   <optionalforeigntable name="ptype" realname="project_status_type" primarykey="id" onforeignkey="id" />
   <optionalforeigntable name="pname" realname="person" primarykey="id" onforeignkey="id" />        
  </datasources>
  <record>        
   <property name="id" fieldname="id" datatype="autoincrement"/>
   <property name="project_status_type_id" fieldname="project_status_type_id" datatype="int" required="true"/>
   <property name="project_type" fieldname="name" datatype="string" table="ptype"/>
   <property name="id_type" fieldname="id" datatype="int" table="ptype"/>       
   <property name="manager_person_id" fieldname="manager_person_id" datatype="int" default=""/>    
   <property name="id_nom" fieldname="id" datatype="int" default="" table = "pname"/>
   <property name="nom" fieldname="Last_name" datatype="String" default="" table = "pname"/>   
   <property name="prenom" fieldname="first_name" datatype="String" default="" table = "pname"/>

Tout les enregistrements sont affichés Dans mon template de liste je code

 {foreach $list as $record}
  <tr>
   <td>{$record->id}</td>
   <td>{$record->project_status_type_id}</td>
   <td>{$record->project_type}</td>
   <td>{$record->manager_person_id}</td>  		
   <td>{$record->nom} {$record->prenom}</td>
   

Le template affiche bien tout les project_status_type_id de la table primaire mais seulement 3 occurences de project_type de la table liée project_status_type (Nombre d'enregistrements de cette table 3) et seulement 7 nom pour la table liée person qui elle à 12 enregistrements

		 

  [Opened] Re: Lier une table

Reply #4 Posted by djanke on 02/08/2008 11:43

Oui en codant dans le dao

 <foreigntable name="ptype" realname="project_status_type" primarykey="id" onforeignkey="project_status_type_id" />
 <foreigntable name="pname" realname="person" primarykey="id" onforeignkey="manager_person_id" />

Mon template de liste affiche bien toutes les occurences je me suis un peu emmélé les pédales je codais comme foreignkey la clé de la table jointe. Par contre dans mon projectform.xml si je code

 <menulist ref="project_status_type_id" selectedvalue=""
                       dao="project~project" 
                       daomethod="findAll"
                       daolabelproperty="project_type"
                       daovalueproperty="id_type">
 <label>Statut</label>
 </menulist>
 <menulist ref="manager_person_id" selectedvalue=""
                       dao="project~project" 
                       daomethod="findAll"
                       daolabelproperty="nom"
                       daovalueproperty="id_nom">
      <label>Responsable Projet</label>
 </menulist>

J'ai bien les 3 ocurrences de la table project_status_type mais seulement 7 de la table person au passage je souhaiterais également concatener prenom après nom dans daolabelproperty. Merci !!!

  [Opened] Re: Lier une table concaténer 2 champs

Reply #5 Posted by djanke on 02/11/2008 11:42

Résolu en cherchant dans la doc je m'apperçois que je peux concaténéer mes 2 champs au niveau du dao

 <!--<property name="first_name" fieldname="first_name" datatype="String" default=""/>   
 <property name="last_name" fieldname="last_name" datatype="String" default=""/>-->
 <property name="identite" datatype="string" selectpattern="CONCAT(first_name, ' ',last_name)" insertpattern="" updatepattern="" />

et dans le template j'appelle :

 daolabelproperty="identite"

Merci pour les autres réponses je nageais un peu.

 
 
Page
  1. Re: Lier une table concaténer 2 champs