Création des classes Active Record

Nous avons besoin de définir deux classes Active Record, UserRecord et PostRecord, qui représentent respectivement les tables users et posts. Les classes Active Record doivent hériter de la classe ActiveRecord, et doivent définir les propriétés qui correspondent aux champs de la table correspondante.

Pour une meilleure organisation de notre arborescence, nous créons un nouveau dossier protected/database qui contiendra nos deux classes. Nous modifions notre fichier de configuration de l'application en y insérant les lignes suivantes. Ceci est équivalent à inclure le dossier protected/database à notre chemin d'inclusion de PHP (include_path). Cela nous permet d'utiliser nos classes sans avoir besoin de les inclure explicitement.

Au lieu de créer nos classes manuellement, nous allons utiliser les outils en ligne de commande de PRADO pour qu'il nous génère les classes.

Dans le dossier blog, lancer la commande suivante pour entrer dans le mode interactif de l'outil en ligne de commande:

php path/to/prado-cli.php shell .

Vous devriez voir

Command line tools for Prado 3.1.0. ** Loaded PRADO appplication in directory "protected". PHP-Shell - Version 0.3.1 (c) 2006, Jan Kneschke >> use '?' to open the inline help >>

A l'invite de commande, entrer les deux commandes suivantes pour créer les classes UserRecord et PostRecord.

>> generate users Application.database.UserRecord >> generate posts Application.database.PostRecord

Ici, nous avons utilisés les espaces de noms pour indiquer où les classes seront créées. Le chemin Application.database.UserRecord indique que nous désirons que la classe soit insérée dans protected/database/UserRecord.php.

Nous devrions voir l'arborescence suivante ainsi que nos deux nouveaux fichiers dans le dossier protected/database:

Si vous consultez le fichier PostRecord, vous devriez voir le contenu suivant:

class PostRecord extends TActiveRecord { const TABLE='posts'; public $post_id; public $author_id; public $create_time; public $title; public $content; public $status; public static function finder($className=__CLASS__) { return parent::finder($className); } }

Comme vous pouvez le constater, pour chaque champs de la table posts, la classe déclare un membre correspondant. La constante TABLE indique le nom de la table que gère la classe PostRecord. La méthode statique finder() permet d'effectuer des requêtes et de lire les données sous forme d'objets PostRecord.

Vous pouvez utiliser l'outil en ligne de commande pour tester nos nouvelles classes. En restant dans le mode interactif de l'outil en ligne de commande, vous pouvez saisir les commandes PHP et voir ce qui suit. Vous pouvez tester des commandes telles que UserRecord::finder()->findAll().

>> PostRecord::finder()->findAll() array ( [0] => PostRecord#1 ( [post_id] => '1' [author_id] => 'admin' [create_time] => '1175708482' [title] => 'first post' [content] => 'this is my first post' [status] => '0' [TActiveRecord:_readOnly] => false [TActiveRecord:_connection] => null [TComponent:_e] => array() ) )

Relations entre Posts et Users

Rappellez-vous qu'il y a une relation entre les tables users et posts. Le diagramme des relations est indiqué ci-après.

A partir de ce diagramme, nous voyons que la table posts contient un champ author_id. Le champ author_id est une clé étrangère qui référence la table users. En particulier, les valeurs du champ author_id doivent apparaitre dans dans le champ username de la table users. Une des conséquences de cette relation, en réfléchissant orienté objet, est que chaque "post" repose sur un "author" et qu'un "author" peut avoir plusieurs "posts".

Nous pouvons modéliser les relations entre posts and users dans nos classes PostRecord and UserRecord en les modifiant comme ci-dessous :

class PostRecord extends TActiveRecord { //... propriétés et méthodes comme précédemment public $author; //contient un objet UserRecord public static $RELATIONS=array ( 'author' => array(self::BELONGS_TO, 'UserRecord'), ); }

La propriété statique $RELATIONS de la classe PostRecord définit que la propriété $author fait référence à un UserRecord. Dans le tableau : array(self::BELONGS_TO, 'UserRecord'), le premier élément défini le type de relation, dans notre cas, self::BELONGS_TO. Le deuxième élément est le nom de l'objet en relation, dans notre cas UserRecord. La classe UserRecord est définie comme ci-dessous, la différence est que chaque objet UserRecord contient plusieurs PostRecord.

class UserRecord extends TActiveRecord { //... propriétés et méthodes comme précédemment public $posts=array(); //contient un tableau de PostRecord public static $RELATIONS=array ( 'posts' => array(self::HAS_MANY, 'PostRecord'), ); }

Un tableau de UserRecord ainsi que les messages correspondants peuvent être lu de la manière suivante :

$users = UserRecord::finder()->withPosts()->findAll(); La méthode withXXX() (avec XXX qui est le nom de la propriété de la relation, dans notre cas Posts) lit les données correspondantes de PostRecords en utilisant une deuxième requête (mais pas en utilisant une jointure). La méthode withXXX() accepte les mêmes arguments que les autres méthodes finder de l'objet Active record, ie : withPosts('status = ?', 0).

Plus d'informations sont disponibles dans le manuel de démarrage rapide Active Record.