Bonjour à tous,
Je bosse sur un site collaboratif avec CakePHP 3 et je bloque sur la génération d'une requête un peu complexe :
En SQL ça donne :
SELECT *
FROM songs, skills_songs
WHERE songs.style_id
IN (SELECT styles_users.style_id FROM styles_users WHERE user_id = $mon_utilisateur)
AND skills_songs.skill_id
IN (SELECT skills_users.skill_id FROM skills_users WHERE user_id = $mon_utilisateur)
GROUP BY songs.id;
Je veux récupérer les morceaux qui ont leur style en commun avec les styles appréciés par l'utilisateur, et les compétences associées au morceau qui correspondent à celles de l'utilisateur ? On me suit toujours ? big_smile
La requête en elle même fonctionne, cependant impossible de m'en sortir avec le "query builder" ... J'ai essayé pas mal de solutions, parcouru la doc', mais pas facile.
Pour l'instant voici ce que j'ai tenté ... !
// les styles des morceaux correspondants à ceux de l'utilisateur
$q_styles = $this->Users->StylesUsers->find()
->where(['user_id' => $user->id])
->select(['style_id']);
// les compétences de mon utilisateur
$q_skills = $this->Users->SkillsUsers->find()
->where(['user_id' => $user->id])
->select(['skill_id']);
/* The requête : les morceaux correspondants aux styles et compétences de l'utilisateur, un morceau a 1 style, et N compétences. C'est au niveau du N que sa foire si je ne m'abuse ! */
$songs = $this->Users->Songs->find()
->where(['style_id IN' => $q_styles])
->contain([
'SkillsSongs' => function ($q) {
return $q
->where(['SkillsSongs.skill_id IN' => $q_skills]);
}
])
->group('Songs.id');
Si cela peut aider à comprendre mon erreur !
Je pense que la doc répondra a tes questions
CF Cake doc
Vous pouvez utiliser matching() quand vous souhaitez donner des contraintes au model primaire selon les associations. Par exemple, vous voulez charger tous les articles qui ont un tag spécifique. Pour plus de détails sur matching(), consultez Filtrer par les Données Associées.