3.7.6.2 hasOne
Mettons en place un modèle Utilisateur avec une relation de type hasOne vers un modèle Profil.
Tout d'abord, les tables de votre base de données doivent être saisies correctement. Pour qu'une relation de type hasOne fonctionne, une table doit contenir une clé étrangère qui pointe vers un enregistrement de l'autre. Dans notre cas la table profils contiendra un champ nommé utilisateur_id. Le motif de base est :
hasOne: *l'autre* modèle contient la clé étrangère. Pomme hasOne Banane => bananes.pomme_id Utilisateur hasOne Profil => profils.utilisateur_id Docteur hasOne Maitre => maitres.docteur_id
hasOne: *lautre* modèle contient la clé étrangère.Pomme hasOne Banane => bananes.pomme_idUtilisateur hasOne Profil => profils.utilisateur_idDocteur hasOne Maitre => maitres.docteur_id
Le fichier du modèle Utilisateur sera sauvegardé dans /app/models/utilisateur.php. Pour définir l'association 'Utilisateur hasOne Profil', ajoutez la propriété $hasOne à la classe du modèle. Pensez à avoir un modèle Profil dans /app/models/profil.php, sans quoi l'association ne fonctionnera pas.
<?php
class Utilisateur extends AppModel {
var $name = 'Utilisateur';
var $hasOne = 'Profil';
}
?>
<?phpclass Utilisateur extends AppModel {var $name = 'Utilisateur';var $hasOne = 'Profil';}?>
Il y a deux manières de décrire cette relation dans vos fichiers de modèle. La méthode la plus simple est de fixer comme valeur à l'attribut $hasOne une chaîne de caractères contenant le nom de la classe associée au modèle, comme nous l'avons fait ci-dessus.
Si vous avez besoin de plus de contrôle, vous pouvez définir vos associations en utilisant un tableau. Par exemple, vous pourriez vouloir classer les colonnes par date décroissante, ou limiter l'association afin qu'elle n'inclue que certains enregistrements.
<?php
class Utilisateur extends AppModel {
var $name = 'Utilisateur';
var $hasOne = array(
'Profil' => array(
'className' => 'Profil',
'conditions' => 'Profil.publie = 1',
'dependent' => true
)
);
}
?>
<?phpclass Utilisateur extends AppModel {var $name = 'Utilisateur';var $hasOne = array('Profil' => array('className' => 'Profil','conditions' => 'Profil.publie = 1','dependent' => true));}?>
Les clés possibles pour un tableau décrivant une association $hasOne sont :
- className : le nom de la classe du modèle que l'on souhaite associer au modèle actuel. Si l'on souhaite définir la relation 'Utilisateur a un Profil', la valeur associée à la clé 'className' devra être 'Profil'.
- foreignKey : le nom de la clé etrangère que l'on trouve dans l'autre modèle. Ceci sera particulièrement pratique si vous avez besoin de définir des relations hasOne multiples. La valeur par défaut de cette clé est le nom du modèle actuel (avec des underscores) suffixé avec '_id'. Dans l'exemple ci-dessus la valeur par défaut aurait été 'utilisateur_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 : "Profil.approuve = 1" sera toujours mieux qu'un simple "approuve = 1".
- fields: une liste des champs à récupérer lorsque les données du modèle associé sont parcourues. Par défaut, cela retourne tous les champs.
- dependent: lorsque la valeur de la clé 'dependent' est true et que la méthode delete() du modèle est appelée avec le paramètre 'cascade' valant true également, les enregistrements des modèles associés sont supprimés.
Une fois que cette association aura été définie, les opérations de recherche sur le modèle Utilisateur récupèreront également les enregistrements Profil liés si il en existe :
//Exemple de résultats d'un appel à $this->Utilisateur->find().
Array
(
[Utilisateur] => Array
(
[id] => 121
[nom] => Gwoo le Kungwoo
[created] => 2007-05-01 10:31:01
)
[Profil] => Array
(
[id] => 12
[utilisateur_id] => 121
[competences] => Cuisiner des gâteaux
[created] => 2007-05-01 10:31:01
)
)
//Exemple de résultats d'un appel à $this->Utilisateur->find().Array([Utilisateur] => Array([id] => 121[nom] => Gwoo le Kungwoo[created] => 2007-05-01 10:31:01)[Profil] => Array([id] => 12[utilisateur_id] => 121[competences] => Cuisiner des gâteaux[created] => 2007-05-01 10:31:01))
