Bonjour, à tous, et merci à Grafikart qui m'a bien aidé dans le début d'apprentissage de CakePHP.

Une question :

J ai un table user et profil (du classique)
1 User a 1 profil
1 profil peut appartenir à plusieurs User

J'ai pas mal galéré pendant quelques jours à mettre en relation ces 2 tables. Lors de l'authentification je récupére les infos de l'utilisateur enregistré avec $this->Auth->user(); un var_dump de cette requete me retourne

array
'id' => string '6' (length=1)
'username' => string 'Photo photosphere' (length=17)
'role' => string 'partenaire' (length=10)
'profile_id' => string '3' (length=1)
'created' => string '2014-08-21 15:30:44' (length=19)
'modified' => string '2014-08-21 15:31:31' (length=19)
'code_client' => string 'C234' (length=4)
'adresse' => string 'azeéazraretgzte' (length=16)
'code_postal' => string '55465' (length=5)
'ville' => string 'S&amzrugapzrea' (length=14)
'telephone' => string '05 54 65 32 21' (length=14)
'email' => string 'mis@jour.com' (length=12)
'Profile' =>
array
'id' => null
'reseaux' => null
'user_id' => null
'logo' => null
'remise' => null

Le profil n'est finalement pas lié. GRRRR

Pouvez m'expliquez cela.

Merci à vous et à très vite

7 réponses


Pakito
Réponse acceptée

Il faut donc modifier la définition des liaisons du Profile :

class Profile extends AppModel
{       
     public $hasMany= 'user';
}

Ta table user devra bien contenir un profile_id. De là, tu pourras récupérer le profil lors du var_dump sur le user.
Par contre, le save en cascade ne fonctionne pas vraiment dans ce sens là. Du coup, pour qu'un utilisateur puisse modifier un profile, j'aurai tendance à dire que tu devras passer par l'action edit($id) du model Profile, et vérifier dans ton action edit que l'utilisateur courant a bien un profile_id = $id, afin de t'assurer qu'il a les permissions pour le modifier.

Pour un projet d'extranet j'ai eu à gérer quelque chose de similaire, dans le sens où un projet pouvait être édité par plusieurs personnes.
La solution la plus simple que l'on ait trouvé, ça a été de créé des groupes, et au sein de ces groupes des permissions.

Du coup, on a une structure du type :

  • Group hasMany User, hasMany Project
  • Project belongsTo Group, belongsTo User (dans le cas où un utilisateur est le seul maître d'un projet)
  • User belongsTo Group

Ca marche plutôt pas mal et ça donne une hiérarchie et une visibilité plus décomposée et claire.

digaburla
Auteur
Réponse acceptée

Ok merci de ta réponse qui implique une sensation de maîtrise, moi j'débute...et j'aime çà !
J'applique ce que tu proposes et reviens vers toi si soucis,
J'attend donc un peu avant de valider la réponse !
Encore merci !!!

Les liaisons multiples ne se font pas dans ce sens là. Enfin pas tel que tu l'explique.

Les seuls modèles viables que je vois sont les suivants :

  • User hasAndBelongsToMany Profile : ça surcharge un peu inutilement, mais au moins le boulot est fait, et comme tu as une table de liaison, tu peux y définir des couches et des règles de gestions personnalisées
  • Profile hasMany User + User belongsTo Profile : ce modèle est plus propre, mais en théorie, tu ne dois pas pouvoir update le profil depuis le user avec ce genre de liaison. Donc il te faudra surcharger les méthodes d'update du profile

Quelles liaisons à tu définis dans tes deux models ?

Tout d'abord merci de ta réponse.
Je n'ai plus les documents sur moi à cette instant mais ce que je peux te dire c'est que mais liaisons sont définies comme cela :
/*user model*/
...public $belongsTo ='profile';
/*user profile*/
...public $hasOne ='User';

Étrange non ?

Deplus je n'ai pas de table de liaison...

Si tu es sur ce type de relation, il n'y a pas de table de liaison.

Cependant, si tu as un profile hasOne user, ça ne peut pas fonctionner. Cake s'attend dans le cas d'une relation 1 - 1 à avoir un champ pour la clé étrangère dans chacune des tables. Là, il ne peut pas trouver ce champ, puisque tu n'as pas de champ user_id dans ta table profile.
Il faut donc partir sur un profile hasMany user.

Je n'ai pas le code sous les yeux, je te le donne demain, mais il semblerait que cela fonctionne.
Merci pour ton intérêt.

Bonjour !
Voici comme promis le code, et je confirme donc ce que j'ai écris plus haut :

/*Mes models*/
class Profile extends AppModel
{       
     public $hasOne = 'user';
}
class User extends AppModel
{       
     public $belongsTo= 'profile';
}
/*Mon controller*/
var_dump($this->Auth->user());
/*vue du var_dump*/
array
  'id' => string '1' (length=1)
  'username' => string 'admin' (length=5)
  'role' => string 'admin' (length=5)
  'profile_id' => string '1' (length=1)
  'created' => string '2014-08-22 13:44:33' (length=19)
  'modified' => string '2014-08-22 13:44:37' (length=19)
  'code_client' => string '' (length=0)
  'adresse' => string '' (length=0)
  'code_postal' => string '0' (length=1)
  'ville' => string '' (length=0)
  'telephone' => string '0' (length=1)
  'email' => string '' (length=0)
  'profile' => 
    array
      'id' => string '1' (length=1)
      'reseaux' => string 'admin' (length=5)
      'user_id' => string '1' (length=1)
      'logo' => string '' (length=0)
      'remise' => string '' (length=0)

Ce dernier me renvoie bien un tableau complet avec les infos du User enregistré ainsi que celles de son profil !
Mais effectivement cela n'est absolument pas logique par rapport à ce que j'ai pu comprendre...

Merci de tes futures explications