3.7.6.4 hasMany
Prochaine étape : définir une association "Utilisateur hasMany Commentaire". Une association hasMany nous permettra de récupérer les commentaires d'un utilisateur lors de la récupération d'un enregistrement Utilisateur.
Lorsque vous définissez les clés de votre base de données pour une relation de type hasMany, suivez cette convention :
hasMany: l'*autre* modèle contient la clé étrangère. Utilisateur hasMany Commentaire => Commentaire.user_id Cake hasMany Vertue => Vertue.cake_id Produit hasMany Option => Option.produit_id
hasMany: l*autre* modèle contient la clé étrangère.Utilisateur hasMany Commentaire => Commentaire.user_idCake hasMany Vertue => Vertue.cake_idProduit hasMany Option => Option.produit_id
On peut définir l'association hasMany dans notre modèle Utilisateur (/app/models/utilisateur.php) en utilisant une chaîne de caractère de cette manière :
<?php
class Utilisateur extends AppModel {
var $name = 'Utilisateur';
var $hasMany = 'Commentaire';
}
?>
<?phpclass Utilisateur extends AppModel {var $name = 'Utilisateur';var $hasMany = 'Commentaire';}?>
Nous pouvons également définir une relation plus spécifique en utilisant un tableau :
<?php
class Utilisateur extends AppModel {
var $name = 'Utilisateur';
var $hasMany = array(
'Commentaire' => array(
'className' => 'Commentaire',
'foreignKey' => 'utilisateur_id',
'conditions' => 'Commentaire.statut = 1',
'order' => 'Commentaire.created DESC',
'limit' => '5',
'dependent'=> true
)
);
}
?>
<?phpclass Utilisateur extends AppModel {var $name = 'Utilisateur';var $hasMany = array('Commentaire' => array('className' => 'Commentaire','foreignKey' => 'utilisateur_id','conditions' => 'Commentaire.statut = 1','order' => 'Commentaire.created DESC','limit' => '5','dependent'=> true));}?>
Les clés possibles pour les tableaux d'association hasMany sont :
- className : le nom de classe du modèle associé au modèle courant. Si l'on souhaite définir la relation 'Utilisateur a plusieurs Commentaire', la valeur associée à la clef 'className' devra être 'Commentaire'.
- foreignKey : le nom de la clef étrangère que l'on trouve dans le modèle actuel. Ceci sera particulièrement pratique si vous avez besoin de définir des relations hasMany multiples. La valeur par défaut de cette clef est le nom de l'autre modèle (avec des underscores) suffixé avec '_id'.
- conditions : un fragment de code SQL utilisé pour filtrer les enregistrements du modèle relié. C'est une bonne pratique que d'utiliser les noms des modèles dans ces portions de code : "Commentaire.statut = 1" sera toujours mieux qu'un simple "statut = 1".
- fields : une liste des champs a récupérer lorsque les données du modèle associé sont parcourues. Par défaut, cela retourne tous les champs.
- order : un fragment de code SQL qui définit l'ordre des entrées associées.
- limit : le nombre maximum d'entrées associées qui seront retournées.
- offset : le nombre d'entrées associées à sauter (les conditions et l'ordre de classement étant donnés) avant de récupérer de nouveaux enregistrements et de les associer.
-
dependent : lorsque dependent vaut true, une suppression récursive du modèle est possible. Dans cet exemple, les enregistrements Commentaires seront supprimés lorsque leur Utilisateur associé l'aura été.
Le second paramètre de la méthode Modele->delete() doit être true afin que la suppression récursive ait lieu.
- finderQuery: une requête SQL complète que CakePHP peut utiliser pour retrouver les enregistrements associés au modèle. Ceci ne devrait être utilisé que dans les situations qui nécessitent des résultats très personnalisés.
Une fois que cette association a été définie, les opérations de recherche sur le modèle Utilisateur récupèreront également les Commentaires reliés si ils existent :
// Exemple de résultat d'un appel à $this->Utilisateur->find().
Array
(
[Utilisateur] => Array
(
[id] => 121
[nom] => Gwoo le Kungwoo
[created] => 2007-05-01 10:31:01
)
[Commentaire] => Array
(
[0] => Array
(
[id] => 123
[utilisateur_id] => 121
[titre] => Sur Gwoo le Kungwoo
[corps] => La Kungwooité est assez Gwooteuse
[created] => 2006-05-01 10:31:01
)
[1] => Array
(
[id] => 123
[utilisateur_id] => 121
[titre] => Plus sur Gwoo
[corps] => Mais qu'en est-il ?
[created] => 2006-05-01 10:41:01
)
)
)
// Exemple de résultat d'un appel à $this->Utilisateur->find().Array([Utilisateur] => Array([id] => 121[nom] => Gwoo le Kungwoo[created] => 2007-05-01 10:31:01)[Commentaire] => Array([0] => Array([id] => 123[utilisateur_id] => 121[titre] => Sur Gwoo le Kungwoo[corps] => La Kungwooité est assez Gwooteuse[created] => 2006-05-01 10:31:01)[1] => Array([id] => 123[utilisateur_id] => 121[titre] => Plus sur Gwoo[corps] => Mais quen est-il ?[created] => 2006-05-01 10:41:01)))
Une chose dont il faut se rappeler est que vous aurez besoin d'une association "Commentaire belongsTo Utilisateur" en complément, afin de pouvoir récupérer les données dans les deux sens. Ce que nous avons défini dans cette section vous donne la possibilité d'obtenir les données de Commentaire depuis l'Utilisateur. En ajoutant l'association "Commentaire belongsTo Utilisateur" dans le modèle Commentaire, vous aurez la possibilité de connaître les données de l'Utilisateur depuis le modèle Commentaire - cela complète la connexion entre eux et permet un flot d'informations depuis n'importe lequel des deux modèles.
