Bonjour/Bonsoir,
J'essaie depuis quelques temps de créer un petit site avec pour objectif de créer une petite communauté. Le principe sur lequel je bloque est le suivant (j'essaierai d'être le plus clair possible :) )
Les différents membres du site auront la possibilité de suivre d'autres membres.
Chaque membre pourra poster un ou plusieurs statut, (visible uniquement par les membres qui suivent ce membre).
Enfin chaque statut pourra être commenté (uniquement par les membres qui suivent ce membre).
Pour ce qui est du code, j'ai 4 modèles.
User > Modèle pour les membres
[code]
public $hasMany = array(
'Follow' => array(
'className' => 'Follow',
'foreignKey' => 'followed_id'
),
'Statut',
'Comment'
);
[/code]
Follow > Modèle pour les différentes connexion entre les membres (2 belongsTo vers User)
[code]
public $belongsTo = array(
'Followby' => array(
'className' => 'User',
'foreignKey' => 'follower_id',
'fields' => array('id', 'username', 'mail')
),
'Followof' => array(
'className' => 'User',
'foreignKey' => 'followed_id',
'fields' => array('id', 'username', 'mail')
)
);
[/code]
Statut > Modèle pour les statuts de chaques membres
[code]
public $belongsTo = array('User');
public $hasMany = array('Comment');
[/code]
Comment > Modèle pour les commentaires
[code]
public $belongsTo = array('User', 'Statut');
[/code]
Chaque membre a une page qui fait appel a une fonction du controller Follow est qui permet d'avoir un affichage des membres qui le suivent et des membres suivi.
Je bloque sur la page de récupération des statuts des membres suivi.
J'utilise un fonction du controller Follow car il me permet de récupérer uniquement les données des membres que je suis.
[code]
$conditions = array(
'contain' => array(
'Followof' => array(
'Statut' => array(
'Comment',
'conditions' => array('Statut.created >' => date('Y-m-d', strtotime("-12 days"))),
'order' => 'Statut.created DESC',
)
)
),
'conditions' => array('Follow.follower_id = ' => $this->Auth->user('id'))
);
$data = $this->Follow->find('all', $conditions);
[/code]
Je trouve cependant que le bahaviors containable fait énormément de requêtes. 2 pour chaque membres suivi..
Première requête qui récupère les membres suivi :
[code]
SELECT Follow
.id
, Follow
.follower_id
, Follow
.followed_id
, Followof
.id
, Followof
.mail
, Followof
.username
FROM beta
.follows
AS Follow
LEFT JOIN beta
.users
AS Followof
ON (Follow
.followed_id
= Followof
.id
) WHERE Follow
.follower_id
= 5
[/code]
Après cette première requête, 2 autres suivent pour chaque membres, une pour récupérer les statuts et une autre pour récupérer les commentaires et cela pour chaque membre suivi. Ce qui peut représenter un très très très grand nombre de requêtes, plusieurs milliers.
[code]
SELECT Statut
.id
, Statut
.status
, Statut
.created
, Statut
.user_id
FROM beta
.statuts
AS Statut
WHERE Statut
.created
> '2014-08-26' AND Statut
.user_id
= (6)
ORDER BY Statut
.created
DESC
SELECT Comment
.id
, Comment
.user_id
, Comment
.statut_id
, Comment
.comment
, Comment
.created
FROM beta
.comments
AS Comment
WHERE Comment
.statut_id
IN (2, 7)
[/code]
Voila mes questions après cet énorme post :) :
Tout d'abord j'aimerais réduire le nombre de requêtes car pour un utilisateur qui suit 500 membres on effectue pas moins de 1000 requêtes...
Ensuite j'aimerai également dans mon find() pour voir récupérer les informations de l’utilisateur actuel, son/ses statuts ainsi que les commentaires associés. Y a t-il une méthode pour ne pas devoir rajouter dans la table Follow que chaque membres se suit lui même ou devoir faire un autre find() pour récupérer uniquement ses valeurs et ensuite les coupler au résultat des membres suivi ?