3.7.6.3 belongsTo

Maintenant que nous avons accès aux données du Profil depuis le modèle Utilisateur, définissons une association belongsTo (appartient a) dans le modèle Profil afin de pouvoir accéder aux données Utilisateur liées. L'association belongsTo est un complément naturel aux associations hasOne et hasMany : elle permet de voir les données dans le sens inverse.

Lorsque vous définissez les clés de votre base de données pour une relation de type belongsTo, suivez cette convention :

belongsTo : le modèle *actuel* contient la clef étrangère.

Banane belongsTo Pomme      => bananes.pomme_id
Profil belongsTo Utilisateur      => profils.utilisateur_id
Maitre belongsTo Docteur     => maitres.docteur_id

Si une table contient une clef étrangère, elle appartient a ...
  1. belongsTo : le modèle *actuel* contient la clef étrangère.
  2. Banane belongsTo Pomme => bananes.pomme_id
  3. Profil belongsTo Utilisateur => profils.utilisateur_id
  4. Maitre belongsTo Docteur => maitres.docteur_id
  5. Si une table contient une clef étrangère, elle appartient a ...

On peut définir l'association belongsTo dans notre modèle Profil (/app/models/profil.php) en utilisant une chaîne de caractère de cette manière :

<?php

class Profil extends AppModel {
    var $name = 'Profil';                
    var $belongsTo = 'Utilisateur';   
}
?>
  1. <?php
  2. class Profil extends AppModel {
  3. var $name = 'Profil';
  4. var $belongsTo = 'Utilisateur';
  5. }
  6. ?>

Nous pouvons également définir une relation plus spécifique en utilisant un tableau :

<?php

class Profil extends AppModel {
    var $name = 'Profil';                
    var $belongsTo = array(
        'Utilisateur' => array(
            'className'    => 'Utilisateur',
            'foreignKey'    => 'utilisateur_id'
        )
    );  
}
?>
  1. <?php
  2. class Profil extends AppModel {
  3. var $name = 'Profil';
  4. var $belongsTo = array(
  5. 'Utilisateur' => array(
  6. 'className' => 'Utilisateur',
  7. 'foreignKey' => 'utilisateur_id'
  8. )
  9. );
  10. }
  11. ?>

Les clés possibles pour le tableau d'association belongsTo sont :

  • className : le nom de classe du modèle associé au modèle courant. Si l'on souhaite définir la relation 'Profil appartient à Utilisateur', la valeur associée à la clef 'className' devra être 'Utilisateur'.
  • 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 belongsTo 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 : "Utilisateur.actif = 1" sera toujours mieux qu'un simple "actif = 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.
  • counterCache : (booléen) si il vaut true le Modèle associé incrémentera ou décrémentera automatiquement le champ "[nom_du_modele_au_singulier]_count" dans la table étrangère dès qu'un appel a save() ou delete() sera effectué. La valeur dans le champ du compteur représente le nombre d'enregistrements liés.

Une fois que cette association aura été définie, les opérations de recherche sur le modèle Profil récupèreront également les enregistrements Utilisateur liés si il en existe :

//Exemple de résultats d'un appel a $this->Profil->find().

Array
(
	[Profil] => Array
        (
            [id] => 12
            [utilisateur_id] => 121
            [competences] => Cuisiner des gâteaux
            [created] => 2007-05-01 10:31:01
        )
    [Utilisateur] => Array
        (
            [id] => 121
            [nom] => Gwoo le Kungwoo
            [created] => 2007-05-01 10:31:01
        )
)
  1. //Exemple de résultats d'un appel a $this->Profil->find().
  2. Array
  3. (
  4. [Profil] => Array
  5. (
  6. [id] => 12
  7. [utilisateur_id] => 121
  8. [competences] => Cuisiner des gâteaux
  9. [created] => 2007-05-01 10:31:01
  10. )
  11. [Utilisateur] => Array
  12. (
  13. [id] => 121
  14. [nom] => Gwoo le Kungwoo
  15. [created] => 2007-05-01 10:31:01
  16. )
  17. )