Я немного борюсь с отношениями 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);
Спасибо за понимание!