Kohana: relations ORM has_one & belongs_to
Après avoir fait une courte introduction à la librairie ORM de Kohana, après avoir écrit un article vous présentant quelque astuces indispensables pour vous faciliter la vie avec l'ORM, il est venu le temps d'aborder l'implémentation des relations (relationships) entre vos tables avec la librairie ORM.
Pour ce faire, nous allons prendre l'exemple d'une base contenant des étudiants (students) et des voitures (cars) appartenant chacune à un étudant. Le schéma ci-dessous présente de façon graphique les relations entre les entités. Dans cet article seules les relations has_one et belongs_to seront abordés (la première case de l'image) donc une relation un pour un (les autres seront traitées ultérieurement).
Cet article est traduit de l'article suivant avec l'accord de son auteur
Les tables SQL
La principale convention dont vous avez besoin de vous souvenir est la pluralité ou non des jeux de données. Si vous avez une table d'étudiants dans votre base de données, alors vous devrez l'appeler qqch comme 'students' (tout en minuscule).
Une autre chose importante est la présence des champs id qui sont obligatoires!!
CREATE TABLE IF NOT EXISTS `cars` ( `id` mediumint(9) NOT NULL AUTO_INCREMENT, `name` varchar(255) collate utf8_unicode_ci NOT NULL, `student_id` mediumint(9) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ; INSERT INTO `cars` (`id`, `name`, `student_id`) VALUES (1, 'car 1', 1); CREATE TABLE IF NOT EXISTS `students` ( `id` mediumint(9) NOT NULL AUTO_INCREMENT, `name` varchar(255) collate utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ; INSERT INTO `students` (`id`, `name`) VALUES (1, 'student 1');
Un détail qui a son importance est le champs student_id dans la table 'cars' qui lie une voiture à un seul étudiant.
Les modèles
Pour faire correspondre les tables précédentes à une classe ORM, vous devez vous assurer que votre classe ORM est au singulier, par exemple 'Student_Model'. De plus La première lettre doit être en majuscule et l'inclusion du suffixe '_Model' est obligatoire.
Les classes ORM correspondantes sont les suivantes:
1 2 3 4 5 6 7 8 | //models/student.php class Student_Model extends ORM{ protected $has_one= array('car'); } //models/car.php class Car_Model extends ORM{ protected $belongs_to=array('student'); } |
Pour créer des relations, vous avez besoin non seulement de mettre en place une relation de 'parenté' dans vos modèles ORM, comme ci-dessus, mais aussi, bien évidement, dans votre base de données.
Utilisation
Voici un exemple de contrôleur permettant d'utiliser ces relations:
Récupération des données
class Test_Controller extends Controller{ public function index() { // On part d'un étudiant d'id 1 et on veut ses voitures $student=new Student_Model(1); // $student->car est un objet de type Car_Model $car=$student->car; echo 'Car:'. $car->name; // Récupère le nom de Car_Model echo '<br>'; // On part d'une voiture d'id 1 pour retrouver l'étudiant la possédant $car=new Car_Model(1); // $car->studentest un objet de type Student_Model echo 'Student:'.$car->student->name; echo '<br>'; $student=new Student_Model(1); $car=$student->find_related_car(); echo 'Car:'. $car->name; if($student->has_car()) { echo 'Student has car'; } } }
Un jeu d'enfant n'est-ce pas ? Voyons maintenant les ajouts et les suppressions.
Manipulation des données
Tout d'abord supprimons la voiture d'un étudiant:
public function removing(){ $student=new Student_Model(1); $student->remove_car(1); if(!$student->has_car()) { echo 'Car was stolen from student'; } }
Ajoutons maintenant une nouvelle voiture à cet étudiant:
public function adding(){ $car=new Car_Model; $car->name='Ferrari'; $student=new Student_Model(1); $student->add_car($car); if($student->has_car()) { echo 'Insurance got the student a new car'; } }
Voilà, c'est tout pour les relations les plus simples à savoir un pour un. Les autres relations sont assez similaires et seront couvertes dans d'autres articles.
Vous pouvez aussi aller jeter un coup d'oeil à la documentation de Kohana concernant la librarie ORM.
Sam Clark a écrit un très bon document qui couvre l'ORM de Kohana (en anglais), vous pouvez le trouver sur son site
Garfield Says:
Je n'ai pas encore abordé la question ORM sur Kohana étant en train de découvrir le framework. Une question apparaît suite à la lecture de votre article. Pour quoi ne pas avoir mis de relation d'intégrité référentiel (cle étrangère) entre les tables? l'ORM de Kohana est il capable de détecter ces relations ? Cela éviterait surement des erreurs.
Posted on octobre 27th, 2008 at 9:29