L'ORM maison


Présentation

L'ORM maison est inspiré de ce que j'ai pu voir: un fichier par table situé dans le répertoire bdd
Un exemple de fichier:

Code


<?php 
Class Article extends ORM{
    
    
//Configuration-------------------------------------------
    
protected $idTab=array('id');
    protected 
$tableName='maTableArticle';
    protected 
$connexion='defaut';
    protected 
$className=__CLASS__;
    
//-------------------------------------------Configuration
    
    //Jointure------------------------------------------------
    
public function init(){
        
//definissez vos jointures ainsi
        //$this->hasOne('Classe_de_la_table_distante')->dont('champ_de_cette_classe')->egal('champ_local');
        //pour l'appeler: $this->recupClasse_de_la_table_distante()->propriete
        
        //exemple pour commande/client
        //sur commande: une commande a un client dont l'id est egal au client_id de la commande
        //$this->hasOne('Client')->dont('id')->egal('client_id');
        //de la commande pour afficher le nom du client: $commande->recupClient()->nom
        //    exple:sur client : un client a plusieurs commandes dont client_id est egal a l'id du client
        //$this->hasMany('Commande')->dont('client_id')->egal('id');
        //    exple:du client pour afficher les commandes
        //foreach($client->recupCommande() as $commande){
        //    echo $commande->id;
        //}
    
}
    
//------------------------------------------------Jointure
    
    //Vos methodes-------------------------------------------    
    
    //Exple pour recuperer l'auteur , dans la vue on fera $article->getAuteur()->nom
    /*public function getAuteur(){
        //on retourne l'objet auteur recupere via la cle etrangere de notre table, ici auteur_id
        return  getInstance('Auteur')->findOne($this->auteur_id);
    }*/

    //les methodes existantes (heritees de ORM)
    /*
    public function find($critere)
        retourne un tableau d'objets repondant au critere $critere
    public function findOne($critere)
        retourne un objet repondant au critere $critere
        attention: dans le cas ou il ne trouve rien, il renvoie un objet vide (pour eviter des erreurs de jointure), 
        pour verifier si on a recupere quelquechose faites un $objet->isVide() pour savoir si vous avez recuperé quelquechose
    public function count($critere)
        retourne le nombre d'enregistrement repondant au critere $critere
    public function findLimit($critere,$tableauLimite)
        retourne un find($critere)  respectant les limites du tableau array(0,10) les 10 resultats a partir du premier (0)
    public function getRequeteTabObj($SQL)
        retourne un tableau d'objets correspondant a la requete $SQL
    public function getRequeteOneObj($SQL)
        retourne un objet correspondant a la requete $SQL
    public function getDate($nomDuChampDelobjet)
        retourne l'objet MKDATE de la date en question
        exple: $commande->getDate('dateCrea')->getFormat('$d $m $Y');
        retourne l'objet MKDATE de la date de creation de la commande au format $d $m $y 25 dec 2007
    public function isVide()
        indique si un objet est vide ou non (la methode findOne retournant toujours un objet, plein ou vide)

    */
    
}
 
?>

Comme vous pouvez le voir le generateur vous fournit un fichier de base qui contient une partie de la documentation de l'orm
Mais en soit chaque fichier ne contient que tres peu de lignes:

protected $idTab

Un tableau contenant le ou les noms des cles primaires

protected $tableName

Le nom réel de la table en base de donnée

protected $connexion

L'identifiant de connexion utilisé (paramétré dans conf/connexion.php)

protected $className

Ne pas toucher, utilisé dans le fonctionnement de l'orm

Son fonctionnement

Le commencement

Soit une table article et une table auteur lié par article.auteur_id = auteur.id
Apres la generation de notre couche modele via le mkbuilder
On obtient deux fichiers dans le repertoire bdd: Article.php et Auteur.php
Chaque fichier est a la fois un "active record" et un "factory". C'est a dire que lorsque vous voulez effectuer un "select * from tableArticle"
Vous allez utiliser la class article, et cela va retourner un tableau de d'objet article.

Code


<?php 
$articleTab
=getInstance('article')->find();
 
?>

Quand je dis que chaque methode retourne un tableau d'objet article, cela veut dire que toutes les methodes que vous ajouterez dans la classe article
seront accessible a partir des enregistrements recupérés

Pour l'exemple: vous voulez faire une jointure sur la table auteur pour recuperer son nom
Ajouter dans article.php

Code


<?php 
public function getAuteur(){
    return 
getInstance('auteur')->findOne($this->auteur_id);
    
//on retourne l'enregistrement auteur recupéré via la FK auteur_id
}
 
?>

Et aussi simplement que possible vous allez afficher le nom de l'auteur ainsi

Code


<?php 
$articleTab
=getInstance('article')->find();
foreach(
$articleTab as $article){
    echo 
$article->getAuteur()->nom;
}
 
?>


Voici une presentation des methodes deja implémentées pour chaque enregistrement via l'ORM

public find($critere)

Retourne un tableau correspondant au critere $critere corespond a un select * from laTableDeLaClasse where $critere

public function findOne($critere)

retourne un objet sur le meme principe que find()
note: si vous l'appelez avec seulement un chiffre ou autre (en l'absence de = order by..) il considere qu'on appelle la clé primaire
attention: dans le cas ou il ne trouve rien, il renvoie un objet vide (pour eviter des erreurs de jointure), pour verifier si on a recupere quelquechose faites un $objet->isVide() pour savoir si vous avez recuperé quelquechose

public function count($critere)

retourne le nombre d'enregistrement repondant au critere $critere

public function findLimit($critere,$tableauLimite)

retourne un find($critere) respectant les limites du tableau array(0,10) les 10 resultats a partir du premier (0)

public function getRequeteTabObj($SQL)

retourne un tableau d'objets correspondant a la requete $SQL

public function getRequeteOneObj($SQL)

retourne un objet correspondant a la requete $SQL

public function getDate($nomDuChampDelobjet)

retourne l'objet MKDATE de la date en question
exple: $commande->getDate('dateCrea')->getFormat('$d $m $Y');
retourne l'objet MKDATE de la date de creation de la commande au format $d $m $y 25 dec 2007

public function isVide()

indique si un objet est vide ou non (la methode findOne retournant toujours un objet, plein ou vide)

Ecrire ses requetes

C'est bien tout ca, mais les requetes que l'on fait ne se contonnent pas a des selection de tout ou la recuperation d'un enregistrement via sa clé primaire.
Par exemple, disons que les articles ont un champ etat qui permet de savoir si un article est un brouillon ou en ligne
Et bien on veut 2 methodes pour selectionner les brouillons et les actifs

Code


<?php 
public function findBrouillon(){
    return 
$this->find('etat=0');
}
public function 
findActif(){
    return 
$this->find('etat=1');
}
 
?>

Note : si vous avez des elements variables, par exemple la requete pour selectionner les articles de tel ou tel auteur
Selection d'article par auteur

Code


<?php 
public function findByAuteur($auteur_id){
    
//La methode quote permet a la fois de proteger une valeur ($this->protect())
    //ainsi que d'ajouter les quotes selon le sgbd choisi (mysql,postresql,sqllite)
    
return $this->find('auteur_id='.$this->quote($auteur_id));
}
 
?>

Si vous voulez effectuer une requete plus complexe
Selon que la requete doivent retenir un element ou un tableau d'elements on utilisera getRequeteOneObj ou getRequeteTabObj

Code


<?php 
public function notreRequeteComplexeOne{
    
    return 
getRequeteOneObj('SELECT article.id, article.titre, auteur.nom 
                                FROM 
                                    '
.$this->getTableName().' as article,
                                    '
.getInstance('Auteur')->getTableName() .' as auteur
                            WHERE ...' 
    
);
 
?>


}