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);
}
}
?>
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-ciprotected $sTable
Le nom réel de la table en base de donnéeprotected $sConfig
L'identifiant de connexion utilisé (paramétré dans conf/connexion.ini.php)protected $tId
Tableau contenant le/les clé primaireSon fonctionnement
Le commencement
Soit une table article et une table auteur lié par article.auteur_id = auteur.idApres 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();
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
}
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 requeteEcrire ses requetes
Si vous avez des elements variables, par exemple la requete pour selectionner les articles de tel ou tel auteurSelection d'article par auteur
CODE
public function findByAuteur($auteur_id){
return $this->findOne('SELECT * FROM auteur where auteur_id=?',(int)$auteur_id);
}