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 modeleUn exemple de fichier:
Il est basé sur les points suivants:
- performance
- transparence
- ergonomie

CODE


 <?php
class model_article extends abstract_model{

protected 
$sClassRow='row_article';

protected 
$sTable='article';
protected 
$sConfig='xml';

protected 
$tId=array('id');

public static function 
getInstance(){
return 
self::_getInstance(__CLASS__);
}

public function 
findById($id){
return 
$this->findOne('SELECT * FROM '.$this->sTable.' WHERE id=?',$id );
}
public function 
findAll(){
return 
$this->findMany('SELECT * FROM '.$this->sTable.' ORDER BY id ASC');
}

public function 
findAllOrderByPriority(){
return 
$this->findMany('SELECT * FROM '.$this->sTable.' ORDER BY priority DESC');
}
}

class 
row_article extends abstract_row{

protected 
$sClassModel='model_article';

public function 
findAuteur(){
return 
model_auteur::getInstance()->findById($this->auteur_id);
}

}
?>
 

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 $sClassRow

Le nom de la classe row du model les requetes retournant des objets instanciant celle-ci

protected $sTable

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

protected $sConfig

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

protected $tId

Tableau contenant le/les clé primaire

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: model_article.php et model_auteur.php
Chaque fichier contient deux classes une row_ (active record) et une autre model_ (factory). C'est a dire que lorsque vous voulez effectuer un "select * from tableArticle"
Vous allez utiliser la class mode_article, et cela va retourner un tableau de d'objet row_article.

CODE


 $articleTab=model_article::getInstance()->find();
 


Quand je dis que chaque methode retourne un tableau d'objet row_article, cela veut dire que toutes les methodes que vous ajouterez dans la classe row_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 model_article.php

CODE


 public function findAuteur(){
return 
model_auteur::getInstance()->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


 $articleTab=model_article::getInstance()->findAll();
foreach(
$articleTab as $article){
echo 
$article->findAuteur()->nom;
}
 



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

public function findOne($requete)

retourne un objet en effectuant la requete

Ecrire ses requetes

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


 public function findByAuteur($auteur_id){
return 
$this->findOne('SELECT * FROM auteur where auteur_id=?',(int)$auteur_id);
}