Après avoir vu comment définir le mapping dans ce précédent article, nous allons voir comment utiliser les classes de ce mapping pour faire du CRUD (Create, Read, Update, Delete) sur nos tables.
Gestion des connexions
Attention Zend_Db_Table utilise l'interface PDO (présente de la version 5.1 de PHP) pour se connecter votre base de données, pensez donc à activer les extensions correspondantes dans le fichier php.in (ie php_pdo.dll et php_pdo_mysql.dll pour une base de données MySql).
Ensuite dans le code il suffit de paramétrer l'adaptateur qui permettra d'établir les connexion de la manière suivante :
$params = array(
'host' => '127.0.0.1',
'username' => 'root',
'password' => 'MY_PASSWORD',
'dbname' => 'test'
);
$db = Zend_Db::factory('Pdo_Mysql', $params);
Zend_Db_Table::setDefaultAdapter($db);
On voit que la méthode static setDefaultAdapter() permet d'enregistrer l'adapteur auprès de la classe Zend_Db_Table, ainsi les connexions/déconnexions seront établies à la demande par cette dernière.
Créations
Pour effectuer une insertion en base de données, il suffit d'instancier la classe mappée sur la table correspondante (la classe Topic pour la table Topics dans notre exemple), puis appeler la méthode createRow() héritée de la classe Zend_Db_Table
$topic = new Topic(); $topic = $topic->createRow();
Vient ensuite l'affectation des différents champs de la table. Ces affectations peuvent s'effectuer en simulant des appels aux attributs de l'objet $topic :
$topic->name=$name; $topic->forum_id=$id; $topic->save();
ou en passant un tableau de paramètre à la méthode createRow
$data=array("title"=>$title,"topic_id"=>$id);
$post = $post->createRow($data);
$post->save();
Sans oublier la sauvegarde pour que les modifications soient commitées.
Sélections
Pour les sélections le mécanisme est exactement le même, c'est à dire que l'on commence par instancier la classe correspondant au nom de la table que l'on veut interroger avant d'utiliser les méthodes suivantes :
- find() pour faire une recherche en filtrant sur la clé primaire
- fetchAll() pour récupérer plusieurs résultats (RowSet) en ayant la possibilité de filtrer via les paramètres de la méthode
- fecth() identique au fetchAll() sauf qu'un seul enregistrement (Row) sera retourné
$forum = new Forum();
$all = $forum->fetchAll(); //FetchAll retourne un RowSet donc parcours
foreach($all as $item){
echo "id:{$item->id}, name:{$item->name}";
}
On voit dans cet exemple qu'en présence d'un RowSet, il faudra le parcourir de manière à récupérer les enregistrement un à un, ce sont en fait des objets Row qui permettent la lecture des valeurs de l'enregistrement.
Pour aller plus loin, comme nous avons défini des relations entre nos table Forum <1_n> Topic <1_n> Post, il est possible d'utiliser ces relations lors d'une selection via les méthode findDependentRowSet("Topic") ou findTopic() pour récupérer tous les enregistrements référençant un Forum. Cette technique est très appréciable pour naviguer dans la structure d'une base de données relationnelle sans ce soucier du SQL et des jointures.
$forum = new Forum();
$forums = $forum->find($pk);
$forum = $forums->current();//on récupère un seul enregistrement forum
echo "FORUM id:{$forum->id}, name:{$forum->name}\n";
$topics = $forum->findDependentRowset("Topic"); //recherche de tous les topics relatifs
foreach($topics as $topic){
echo "\t TOPIC id:{$topic->id}, name:{$topic->name}\n";
$posts = $topic->findPost(); //recherche de tous les posts relatifs
foreach($posts as $post){
echo "\t\t POST id:{$post->id}, title:{$post->title}\n";
}
}
Tous les sources de cette démo sont en pièce jointe, il vous faudra simplement créer une base de données "test" ainsi que les trois tables Forums, Topics et Posts. Bon courage et merci pour vos éventuels retours.


