wiki:CopixDAO

Introduction

Les DAO dans Copix sont un moyen pour dialoguer avec la base de données rapidement et sans effort. En effet, Copix va générer pour vous toutes les requêtes SQL classiques sur une table donnée dans un objet prêt à l'emploi.

Vous pouvez demander à Copix un DAO soit à partir d'un fichier XML, soit simplement à partir du nom d'une table.

Au besoin, vous pourrez écrire des méthodes spécifiques en PHP qui feront partie de l'objet CopixDAO.

Un exemple concret et complet de l'utilisation des DAO :

<?php
$enregistrement = _dao ('maTable')->get ('clef_primaire');

Structure

Dans Copix, nous avons implémenté cet élément sous une forme simple que nous avons voulue efficace :

  • Une fabrique (CopixDAOFactory) pour instancier les DAO. Cette fabrique dispose d'un alias (_dao () ou _ioDAO ())
  • Les "DAO" qui implémentent les dialogues avec la base (insertion, modification, récupération, recherche, ...)
  • Les "DAORecords" qui sont des représentations objets des enregistrements.

Méthodes standard

Les DAO disposent, en standard des méthodes suivantes :

  • get pour récupérer un enregistrement à partir de sa clef primaire
  • insert pour insérer un enregistrement
  • update pour mettre un enregistrement à jour
  • delete pour supprimer un enregistrement à partir de sa clef primaire
  • findAll pour récupérer le contenu complet de la table
  • findBy pour récupérer des données, selon certains critères de sélection ou de tri
  • countBy pour compter des données, selon certains critères de sélection
  • deleteBy pour supprimer des données, selon certains critères de sélection
  • check pour vérifier la validité de l'enregistrement

Méthodes spécifiques

Il est également possible de déclarer, voir de développer facilement d’autres méthodes, soit dans :

Un exemple complet

Le fichier de définition XML

Supposons que nous ayons une table d'actualités appelée news où chaque actualité puisse appartenir soit à aucun soit à un auteur :

<?xml version="1.0" encoding="UTF-8" ?>
<daodefinition>
   <datasource>
      <tables>
         <table name="news" primary="yes" />
         <table name="authors" join="left" />
      </tables>
   </datasource>

 <properties>
  <property name="id_news"
         captioni18n="dao.news.fields.id_news"
         pk="true"
         required="yes"
         type="autoincrement"
         sequence="SEQ_news"
         />
  <property name="title_news"
         captioni18n="dao.news.fields.title_news"
         type="string"
         maxlength="50"
         required="yes"
         />

  <property name="summary_news"
         captioni18n="dao.news.fields.summary_news"
         type="string"
         maxlength="255"
         required="yes"
         />

  <property name="content_news"
         captioni18n="dao.news.fields.content_news"
         type="string"
         required="yes"
         />

  <property name="datewished_news"
         captioni18n="dao.news.fields.datewished_news"
         type="int"
         required="yes"
         />

  <property name="status_news"
         captioni18n="dao.news.fields.status_news"
         type="int"
         required="no"
         />

  <property name="id_autor"
         captioni18n="dao.news.fields.id_autor"
         type="int"
         fkTable="authors"
         fkFieldName="id_autor"
         />
   <property name="author_name"
         captioni18n="authors|dao.autors.autor_name"
         type="string"
         />
   <property name="author_email"
         captioni18n="authors|dao.autors.autor_email"
         type="string"
         maxlength="255"
         />
 </properties>
</daodefinition>

La définition de méthodes supplémentaires en XML

Nous souhaiterions récupérer toutes les actualités d'un auteur ; donc une méthode findAllByAutor :

<?xml version="1.0" encoding="UTF-8" ?>
<daodefinition>
   <datasource>
        ....
   </datasource>

 <properties>
    ....
 </properties>

 <methods>

   <method name="findAllByAutor" type="select">

         <parameters>
            <parameter name="id_author" />
         </parameters>

         <conditions>
            <condition property="id_author" operator="=" value="$id_author" />
         </conditions>

         <order>
            <orderitem property="title_news" way="asc" />
         </order>

    </method>
 </methods>

</daodefinition>

La définition de méthodes supplémentaires en php

Nous souhaiterions envoyer un mail à l'auteur lorsqu'on supprime une actualité lui appartenant et disposer d'un compteur d'actualité par auteur.

On crée un fichier news.dao.php dans le répertoire classes du module news :

<?php
class DAONews {
        function delete ($id_news){
                $news = $this->get($id_news);
                // Si l'auteur dispose d'une adresse de messagerie 
                if ($news->autor_email != "") { 
                        $from = "contact@copix.org"; 
                        $fromName = "contact@copix.org";  
                        $subject = "Suppression d'actualité" 
                        $message = "Une actualité a étée supprimée"; 
                        $eMail = new CopixHtmlEMail ($to, "", "", $subject, $message); 
                        $eMail->send ($from, $fromName);  
                }  
                // je supprime l'objet normalement 
                $this->_compiled_delete($id_news); 
        }  

        function nbNews($id_author) { 
                // On compte directement en SQL
                $arResults = _doQuery('select count(ID_NEWS) as count_news from news where id_autor=:id_author', array ('id_author'=>$id_author));
                return $arResults[0]->count_news;  
        }
}
?>

Utilisation de la DAO

<?php

// On boucle sur toutes les actualités 
foreach (_dao ('News')->findAll () as $news) { 
        // On supprime toutes actualités qui n'ont pas d'auteur 
        if (is_null($news->id_autor)) { 
                _dao ('News')->delete ($news->id_news); 
        } else { 
                $nbNews = _dao ('News')->nbNews ($news->id_autors); 
                echo ($news->autor_name." dispose de $nbNews actualités."); 
        } 
} 
?>