Указание типа поиска в виде 'list' несовместимо с поведением Containable.
Используйте объединения вместо этого:
$selectedCategories = $this->Category->find('list', array(
'joins' => array(
array(
'table' => 'categories_landmarks',
'alias' => 'CategoriesLandmark',
'type' => 'inner',
'conditions' => array("CategoriesLandmark.category_id = Category.id")
),
array(
'table' => 'landmarks',
'alias' => 'Landmark',
'type' => 'inner',
'conditions' => array(
"CategoriesLandmark.landmark_id = Landmark.id",
'Landmark.num' => 7
)
),
)
));
В идеале я бы поместил это прямо в модель категории следующим образом:
function fetchListByLandmarkNum($landmarkNum) {
return $this->find('list', array(
'joins' => ...
));
}
А затем вызвать его из контроллера:
$selectedCategories = $this->Category->fetchListByLandmarkNum(7);
$this->set(compact('selectedCategories'));
Всегда делайте ваши модели толстыми, а контроллеры - худыми. Теперь вы можете использовать эту функцию в другом месте. :)
Причина, по которой ВСЕ категории возвращаются, заключается в том, что условие применяется к соответствующим моделям наземных ориентиров. Результатом этого Запрашиваемого запроса будет выборка всех Категорий и возврат только тех моделей Landmark, которые удовлетворяют num = 7. Он НЕ должен интерпретироваться как возвращающий только те Категории, для которых модели Landmark удовлетворяют условию.