Фильтрация тегов CakePHP и HABTM - PullRequest
0 голосов
/ 19 февраля 2010

Я немного борюсь с отношениями CakePHP HABTM, и я застрял, пытаясь выполнить, казалось бы, простую задачу. У меня есть много Лагерей и много Новостей. Каждый элемент NewsItem может иметь отношение к любому из лагерей, поэтому, когда пользователь создает элемент NewsItem, он проверяет, для какого лагеря предназначен элемент. Это идея.

Итак ...

Я хотел бы включить фильтрацию лагеря в мои представления NewsItems. Другими словами, я хотел бы видеть все элементы новостей, относящиеся к лагерю "A" и лагерю "B".

Добавление условий к функциям "находить" и "разбивать на страницы" работает как шарм.

Однако ...

Если элемент NewsItem принадлежит нескольким лагерям, он появляется в списке несколько раз. Поэтому, когда я скажу найти, чтобы отдать мне все NewsItems, которые принадлежат лагерю "A" и лагерю "B", NewsItem, принадлежащий лагерю "A" и лагерю "B", появится дважды.

Запрос отладки выглядит так:

ВЫБРАТЬ NewsItem. id, NewsItem. user_id, NewsItem. heading, NewsItem. body, NewsItem. modified, User. first_name ОТ news_items КАК NewsItem ЛЕВОЕ СОЕДИНЕНИЕ users КАК User ВКЛ (NewsItem. user_id = User. id) СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ camps_news_items КАК CampsNewsItem ВКЛ. . news_item_id = NewsItem. id) ГДЕ CampsNewsItem. camp_id IN (1, 5) ЗАКАЗАТЬ НА NewsItem. modified desc LIMIT 10

SELECT Camp. id, Camp. name, Camp. created, Camp. modified, CampsNewsItem. camp_id, CampsNewsItem. news_item_id FROM camps AS Camp JOIN camps_news_items AS CampsNewsItem ON (CampsNewsItem. news_item_id IN (6, 6, 7, 8) и CampsNewsItem. camp_id = Camp. id) ГДЕ 1 = 1

PHP-код выглядит так:

$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);

Спасибо за понимание!

1 Ответ

2 голосов
/ 19 февраля 2010

Попробуйте это:

$params['group'] = array('NewsItem.id');
...