Je me bats un peu avec les relations CakePHP HABTM, et je me suis bloqué en essayant de faire une tâche apparemment simple. J'ai beaucoup de Camps et de nombreux NewsItems. Chaque élément d'information peut être pertinent pour l'un des camps, donc lorsqu'un utilisateur crée un élément, il vérifie à quel camp l'objet est destiné. C'est l'idée.CakePHP et HABTM Tag Filtering
Alors ...
Je voudrais intégrer un certain camp filtrant dans mes vues bulletins d'informations. En d'autres termes, j'aimerais voir tous les articles d'information pertinents au camp «A» et au camp «B». Ajouter des conditions aux fonctions «trouver» et «paginer» fonctionne comme un charme.
Mais ...
Si un NewsItem appartient à plusieurs camps, il semble à plusieurs reprises dans la liste. Alors quand je dis de trouver tous les NewsItems qui appartiennent au Camp "A" et au Camp "B", un NewsItem appartenant au Camp "A" et au Camp "B" apparaîtra deux fois.
La requête ressemble debug ceci:
SELECT
NewsItem
.id
,NewsItem
.user_id
,NewsItem
.heading
,NewsItem
.body
,NewsItem
.modified
,User
.first_name
DEnews_items
ASNewsItem
LEFT JOINusers
ASUser
ON (NewsItem
.user_id
=User
.id
) LEFT JOINcamps_news_items
CampsNewsItem
AS ON (CampsNewsItem
.news_item_id
=NewsItem
.id
) OÙCampsNewsItem
.camp_id
IN (1, 5) COMMANDEZ PARNewsItem
.modified
desc LIMITE 10SELECT
Camp
.id
,Camp
.name
,Camp
.created
,Camp
.modified
,CampsNewsItem
.camp_id
,CampsNewsItem
.news_item_id
DEcamps
ASCamp
REJOIGNEZcamps_news_items
ASCampsNewsItem
ON (CampsNewsItem
news_item_id
IN (6, 6, 7, 8) ETCampsNewsItem
camp_id
=Camp
id
...) OU 1 = 1
Le code php ressemble à ceci:
$camp_ids = array(1, 3, 6, 10);
$conditions = array('CampsNewsItem.camp_id' => $camp_ids);
$params['conditions'] = $conditions;
$this->NewsItem->bindModel(array('hasOne' => array('CampsNewsItem')));
$news_items = $this->NewsItem->find('all', $params);
Merci pour tout renseignement!
Parfait! Merci beaucoup! –
Une idée de comment faire fonctionner correctement l'assistant paginate? –