Recupérer vos informations de modèles reliés entre eux sur plusieurs niveaux en cakephp
Pour relier des modèles entre eux en cakephp, vous utilisez les hasone, hasmany, belongsto etc…
Si vous souhaitez relier votre modèle « message » à votre modèle « user », vous faites comme ceci sur votre modèle message:
public $belongsTo=array( 'User' => array( 'className' => 'User', 'foreignKey'=>'id_user' ), );
Un « message » appartient à un « user ».
Donc si vous souhaitez récupérer les informations de l’utilisateur sur un commentaire, vous faites :
$this->Message->find('first');
et vous retourne ceci :
Array ( [Message] => Array ( [id] => 18 [message] => reponse 1 [id_user] => 2 etc... ) [User] => Array ( [id] => 2 [username] => user etc... ) )
Maintenant que se passe t-il si vous avez un forum qui a des messages et ces messages sont reliés à des utilisateurs?
Vous allez relier vos 3 modèles ensemble. Ayant déjà reliés vos 2 précédents modèles, vous n’avez plus qu’à relier votre modèle « forum » à votre modèle « user » et « message ».
Donc sur votre modèle « forum » vous indiquez :
public $belongsTo=array( 'User' => array( 'className' => 'User', 'foreignKey'=>'id_user' ), ); public $hasMany=array( 'Message' => array( 'className' => 'Message', 'foreignKey'=>'id_forum', ), );
Un « forum » appartient à un « user » et un « forum » a plusieurs « message »s.
Cette chose faite, si vous faites :
$this->Forum->find('first');
Vous récupérez :
Array ( [Forum] => Array ( [id] => 5 [titre] => titre forum [message] => message forum [id_user] => 2 ) [User] => Array ( [id] => 2 [username] => user etc... ) [Message] => Array ( [0] => Array ( [id] => 18 [message] => reponse 1 [id_user] => 2 [id_forum] => 5 ) ) )
Et là vous vous dites, et comment je récupère les informations de l’utilisateur 2 du premier message? Pourtant j’ai bien relié mon modèle « message » à « user », c’est quoi ce délire, quel scandale etc… 😀
Alors pour des raisons de performance, cakephp ne récupère pas plusieurs niveaux de « profondeur » (c’est le terme de la doc’).
Vous pouvez par contre modifier la valeur de l’attribut « recursive » qui vous permettra d’accéder au 2ème, 3ème niveau etc…
Par défaut, cet attribut a comme valeur 1. Il peut prendre comme valeur -1, 0, 1 ou le nombre souhaité. Pour les explications, je vous renvoi à la doc de l’attribut recursive
Il est conseillé de ne pas modifier la valeur de cet attribut inutilement mais si vous n’avez pas de contraintes de performances et que vous êtes feignant 😀 , vous pouvez modifier la valeur par défaut (1) en 2 par exemple. Cela vous permettra d’accéder au 2ème niveau de vos modèles sans faire la manip que l’on va faire tout à l’heure.
Pour cela, vous pouvez mettre dans votre Appmodel (n’oublions pas que c’est un attribut de modèle) :
public $recursive = 2;
Vous aurez désormais votre recursive à 2 sur TOUTES vos requêtes, attention aux perfs 😉
Si vous êtes toujours là, c’est bien, vous n’avez pas voulu faire ça à la barbare 😀
Donc continuons le tuto.
Comment récupérer vos informations de modèles reliés entre eux sur plusieurs niveaux?
Je vous ai présenté la méthode « barbare » qui modifie toutes vos requêtes sans que vous ayez besoin de faire la modification pour chaque.
Vous avez aussi la méthode plus propre qui permet de modifier le niveau de profondeur sur les requêtes dont vous avez besoin.
Ça se passe dans votre « find », vous n’avez qu’à rajouter la clé « recursive » dans votre tableau de paramètres :
$this->Forum->find('first',array('recursive'=>2));
Et désormais, vous récupérez :
Array ( [Forum] => Array ( [id] => 5 [titre] => titre forum [message] => message forum [id_user] => 2 ) [User] => Array ( [id] => 2 [username] => user etc... ) [Message] => Array ( [0] => Array ( [id] => 18 [message] => reponse 1 [id_user] => 2 [id_forum] => 5 [User] => Array ( [id] => 2 [username] => user etc.. ) ) ) )
Vous avez désormais votre tableau « user » dans votre tableau « message ». Vous pouvez donc afficher le pseudo de votre membre ainsi que ces autres informations.
Vous savez désormais utiliser la propriété « recursive » qui est très simple à mettre en place mais quand on ne la connait pas, peut vous faire chercher de longues heures.
Si vous avez apprécié cet article, n’hésitez pas à le partager sur les réseaux sociaux et/ou de laisser un commentaire ci dessous.
Bon dev à vous 😉