Хорошо, я уже на своем компьютере :).
В ShopModel:
class ShopModel extends AppModel {
public $hasMany = array(
'Catalog' => array(
// binding params here...
),
);
}
В CatalogModel:
class CatalogModel extends AppModel {
public $hasMany = array(
'Product' => array(
// binding params...
),
),
}
... и это продолжается ...
Если вы не хотите, чтобы получить избыточные данные во всех действий, вы должны установить в AppModel:
class AppModel extends Model {
public $recursive = -1;
}
В действии контроллера, где вы вызываете функции поиска с ассоциациями:
$this->Shop->Behaviors->load('Containable');
$big_array = $this->Shop->find('all', array(
'conditions' => array(
//...
),
'contain' => array(
'Catalog' => array(
'Product' => array(
// etc, you get the point :)
),
),
),
));
Также приятно объявить $ belongsTo ассоциации, так что вы можете получить доступ что-нибудь из любого места, что-то вроде этого:
$this->Catalog->Behaviors->load('Containable');
$big_array = $this->Catalog->find('all', array(
'conditions' => array(
//...
),
'contain' => array(
'Product' => array(
// ...
),
'Shop' => array(
// ...
),
),
));
EDIT
Я вижу, у вас есть Product-> Категория отношение, которое я угадываю будет определяться с $ belongsTo. Если вы выполните запрос, подобный приведенному выше, вы получите много повторяющихся запросов (одна и та же категория во многих продуктах). Вы можете использовать $this->Category->find('list')
, но очень часто я нахожу это неуместным, поскольку он возвращает только одно поле (я был бы признателен, если кто-то знает способ, как я могу получить больше полей со списком).Для этого, мой обходной путь делает пользовательскую функцию в модели категории, как это:
class Category extends AppModel {
public function getSorted ($options = array()) {
$temp= $this->find('all', $options);
$output = array();
foreach ($temp[$this->alias] as $row) {
$output[$this->alias][$row['id']] = $row;
}
unset($temp);
return $output;
}
}
Тогда в контроллере я бы объявить два массива, один большой без категории ассоциации и список категорий одно:
$this->loadModel('Category');
$this->set('categories', $this->Category->getSorted());
Таким образом, я могу получить нужную строку категории по категории id везде, где она мне нужна в представлении.
Я нахожусь на мобильном телефоне и не могу написать точный ответ, но вы должны попробовать объявить ассоциации уровня 1 в каждой модели и прочитать о сдерживаемом поведении. –