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

  [Opened] Insertion d'un enregistrement jDao

Posted by mik378 on 01/03/2009 21:39

Bonjour,

je débute avec Jélix et voici ma question :

J'ai une classe métier User, ainsi quand je fais une requête pour récupérer des enregistrements d'utilisateurs, je réceptionne alors le record correspondant et à partir de ce record, je rempli les champs de mon objet User. Maintenant je voudrais insérer un nouvel utilisateur en base. Dans la doc de Jélix il est indiqué qu'il faut utiliser la méthode du factory "insert(mon_record)".

La question est donc comment faire pour transformer mon objet User (à insérer) en record.

Merci beaucoup.

  [Opened] Re: Insertion d'un enregistrement jDao

Reply #1 Posted by laurentj on 01/03/2009 23:52

Bonjour,

je réceptionne alors le record correspondant et à partir de ce record, je rempli les champs de mon objet User

Tu ne devrais pas avoir à faire ça, c'est un peu inutile. Le record devrait être ton objet métier justement.

Et pour insèrer un nouvel utilisateur, fait un jDao::createRecord(..) et utilise la méthode insert.

  [Opened] Re: Insertion d'un enregistrement jDao

Reply #2 Posted by mik378 on 01/04/2009 01:42

En fait, un membre du forum m'avait conseillé de faire comme ceci :

 class maClasseMetier {
   public $monAttibut1; // correspond au champ monAttribut1 en base
   .....
   public $monAttributn;

   public function __construct($record){
       // recopie de tous les champs de l'enregistrement dans les attributs du  nouvel objet
       foreach ($record as $key => $value) {
           $this->$key=$value;
       }
       ..... ici tu peux faire plein d'autres trucs comme récupérer des infos par jointure
   }

Ceci afin de pouvoir manipuler justement mon record. Je suis d'accord que mettre un objet record dans une classe c répétitif mais alors comment faire alors pour pouvoir y effectuer des traitements dessus si on ne passe pas par une classe métier. Comme par exemple, empêcher certaines valeurs d'être saisies (ce que j'aurai fait grâce à une méthode setMaValeur() où j'y mettrais mes conditions par exemple).

Merci d'avance

  [Opened] Re: Insertion d'un enregistrement jDao

Reply #3 Posted by mik378 on 01/04/2009 16:40

En fait, depuis le début je comparais jDao à Hibernate(en java) qui lui se basait sur des classes métiers mais en fin de compte ce n'est pas le même genre de système. Si j'ai bien compris, le plus utile avec jDao c'est de créer ses classes services; l'objet métier étant le record lui même.

Merci beaucoup pour ces explications :)

  [Opened] Re: Insertion d'un enregistrement jDao

Reply #4 Posted by manooweb on 01/05/2009 09:06

Salut

L'autre membre du forum c'est moi ;-) Pour apporter quelques précisions.

j'ai fait comme cela car ma classe métier ne se limite pas à un seul Dao mais 2 ou 3 avec des relations entre eux et que je ne voulais pas faire le traitement dans le template ( ce n'est pas sa vocation). En effet, dans mon cas pour afficher les données dans le template j'ai besoin des infos d'une table mais également des informations de 2 autres tables (listes). D'ailleurs dans les 2 propriétés de ma classe métier j'y stocke le tableau de record renvoyé par le dao correspondant (monDao->maMethode->fetchAll() ).

c'est vrai que je n'ai pas penser à ecrire cela comme çà, merci Laurent. Je crois qu'il va y avoir une légère optimisation dans mon code :-D

 class maClasseMetier {
  
     protected $record = null;
   
     public function __construct($id){
         if($id) {
           $dao = jDao::get('..');
           $this->record = $dao->get($id);
         }

Pour les histoires de __get, je ne les ai pas utilisé car dans les évaluations de template je n'ai pas pu mettre de "(" (une erreur jelix m'était renvoyée) Donc les propriétés de ma classe métier sont publiques pour pouvoir y accéder dans le template sous la forme (maClasseMetier->record->monAttribut ou maClasseMetier->maListe).

Pour la mise à jour de la base (que je n'ai pas encore développée) je ne pensais pas passer par cette classe métier puisque de toute manière, il faut mettre à jours les 3 tables séparément et donc avec 3 Dao distincts et la problématique est sensiblement différente.

Dans les cas plus simples(pas de jointure complexe) je fais directement via le Dao dans le controleur (je n'ai pas besoin d'un service en tant que tel) et ma classe métier est bien le record issu du Dao.

@+ m@nu


Manu

  [Opened] Re: Insertion d'un enregistrement jDao

Reply #5 Posted by manooweb on 01/05/2009 15:59

Merci encore Laurent pour ces précisions.

j'avais buté là dessus sur mon développement actuel (par mauvaise connaissance de php5) et je m'en étais sorti comme cela.

On apprend tous les jours ;-)) et je vais m'empresser de corriger mon code.

Pour info http://fr3.php.net/manual/fr/language.oo(..) et http://fr3.php.net/manual/fr/language.oo(..)


Manu

  [Opened] Re: Insertion d'un enregistrement jDao

Reply #6 Posted by laurentj on 01/06/2009 10:22

en fait par exemple moi je fais une première requête du type findAll() ensuite je boucle sur le résultat pour instancier mes objets à partir de la classe métier mais si dans mon constructeur je refais un get($id) je refais x requêtes pour récupérer les informations que j'ai déjà (issues de la requête findAll() ).

je t'ai donné un exemple. Maintenant à toi d'adapter en fonction de tes besoins.

Sinon, autre solution : tu ne passes pas par un dao, mais directement par jDb et ton propre sql:

   $sql = "select .....";
   $cnx = jDb::getConnection();
   $resultset = $cnx->query($sql, $cnx::FETCH_CLASS, 'User');

(ces paramètres additionnels sur query() ne sont utilisable que dans jelix 1.1RC, ou alors indiquer le driver PDO)

Et des fetch() sur resultset (ou un parcours avec foreach) te renverra des objets User, remplis avec les champs indiqué dans le select (les propriétés correspondantes doivent être publique)

ah oui sinon petite confusion quand je parlais d'accesseur (get) c'est d'accesseur pour accéder à une propriété privée de classe (au sens javaBean) pas de la méthode magique __get

Et ? je ne vois pas de différence...

c'est ce getMaPropriete() qui provoque une erreur dans le template à cause des parenthèses de la méthode.

il n'y a pas de raison que ça provoque une erreur, à moins que tu ais une veille version de Jelix. Ou alors indique un exemple qui montre le contraire ?

 
Page
  1. Re: Insertion d'un enregistrement jDao