В соответствии с заголовком вашего вопроса, если задача состоит в том, чтобы получать только элементы, связанные с категориями с именем «bla», вы можете просто вызвать метод find () в модели категорий вместо модели элементов.
Вместо
$this->Item->find('all', array('conditions' => array('Category.name' => 'bla')));
сделать
$this->Item->Category->find('all', array('conditions' => array('Category.name' => 'bla')));
Таким образом, он сначала отфильтрует соответствующие Категории, а затем получит связанные Предметы. Таким образом, вы получите что-то вроде
Array
(
[0] => Array
(
[Category] => Array
(
[id] => 1
[name] => bla
...
)
[Item] => Array
(
[0] => Array
(
[id] => 1
...
)
[1] => Array
(
[id] => 2
...
)
)
)
)
EDIT
С тремя моделями, связанными вместе, это немного сложнее. Единственное решение, которое я могу придумать, чтобы предотвратить загрузку большого количества данных, - это создать запрос с INNER JOIN:
$categories = $this->Category->find('all', array('fields' => array('Category.id', 'Category.name', 'Item.id', 'Item.name'),
'joins' => array(
array( 'table' => 'groups',
'alias' => 'Group',
'type' => 'inner',
'conditions' => 'Group.category_id = Category.id'
),
array( 'table' => 'items',
'alias' => 'Item',
'type' => 'inner',
'conditions' => array('Item.group_id = Group.id', 'Item.name' => 'bla')
))));
Он вернет массив следующим образом:
Array
(
[0] => Array
(
[Category] => Array
(
[id] => 2
[name] => Shop
)
[Item] => Array
(
[id] => 1
[name] => Bla
)
)
)
EDIT2
Последнее слово о структуре массива, который вы получите: он не совсем такой, как вы хотели. Массив Item находится на том же уровне, что и массив Category. Таким образом, вы можете получить много пар Category-Item для одной и той же категории.
Но тогда простой цикл foreach позволил бы вам создать массив с точным желаемым struture, и этот запрос имеет то преимущество, что получает из базы данных только то, что необходимо.