Закрыть.Попробуйте это:
$this->set('posts', $this->Category->find(
'first',
array(
'conditions' => array(
'Category.uri' => $uri
),
'contain' => array('Post' => array('Category'))
)
));
Касательная
При написании кода контроллера, подобного этому, возникают проблемы:
- Это раздувает ваши методы контроллера и сделает ваши контроллеры менее читаемыми.1009 *
- Он не позволяет вам повторно использовать бизнес-логику между различными контроллерами.
Вы можете удовлетворительно исправить эти проблемы, переместив вызов поиска в метод модели:
// Categories Controller
$this->set('posts', $this->Category->get_posts_with_cats($uri));
// Category Model
function get_posts_with_cats($uri) {
$this->find('first', array(
'conditions' => array('Category.uri' => $uri),
'contain' => array('Post' => array('Category'))
));
}
Это делает ваш код Подробнее Awesome :
- Контроллер хорош и Тощий , и супер читабелен.
- Теперь выМожно вызвать тот же метод из любой связанной модели.Так, например, в вашем
PostsController
вы можете позвонить: $this->Post->Category->get_posts_with_cats($uri);
.Ваш код теперь DRY .
Tangent # 2
После того, как вы научитесь вкладывать вмещаемые модели, как я вам показал, вы можете испытать искушение вбудущее, чтобы сделать что-то вроде этого:
$this->find('first', array(
'conditions' => array('Category.uri' => $uri),
'contain' => array(
'Post' => array(
'Category' => array(
'Tag' => array('Author')
)
)
)
));
Хорошая новость? Вы получите требуемые данные модели из вышеуказанного метода (если вы определили все эти отношения).
Ужасные новости? CakePHP не знает, как оптимизировать запросы для глубоких ассоциаций, подобных этой.Таким образом, по мере роста вашей базы данных вы получите десятки (если не сотни (если не тысячи)) SELECT
запросов к базе данных, что приведет к полному обходу приложения (если не останов * 1046).*.)
Хорошие люди, которые проектируют CakePHP, работают над улучшением сдерживаемого поведения для CakePHP 2.0, но вам придется подождать до тех пор, чтобы получить этот уровень точности.