编辑 - 我能够使用来自'Farray'的代码解决此问题并进行以下更改:
$categories = $this->Category->find(
'all',
array(
'fields' => array(
'Category.id',
'Category.title'
),
'order' => 'Category.title ASC',
'contain' => array(
'Article' => array(
'fields' => array(
'Article.id',
'Article.title',
'Article.slug',
'Article.main_image'
),
'conditions' => array(
'published' => 1
),
'order' => 'Article.id DESC',
'limit' => 4
)
)
)
);
============================================ ======================================
我的应用程序有一个文章控制器以及类别控制器。我想在文章索引的底部显示我的所有类别,并且每个类别我想要显示以下4篇文章:
Category 1
article 1
article 2
article 3
article 4
Category 2
article 1
article 2
article 3
article 4
etc...
目前,我正在使用index.ctp中的以下代码完成此操作
foreach($categories as $category){
echo $category['Category']['title'];
$this->element('related_articles', array('categoryID'=>$category['Category']['id']));
}
基本上,我通过所有可用的类别和foreach中的每个类别
对于我拥有的每个类别,都会重复此过程。显然,这不是最好的方法。什么是最好的方法?
以下是我在文章控制器视图函数中使用的类别:
$categories = $this->Article->Category->find(
'all',
array(
'fields' => array(
'Category.id',
'Category.title'
),
'order' => 'Category.id DESC',
'recursive' => 1,
'limit' => 1
)
);
有了这个,我的负载时间大大减少了,如果我能找到另一种更快的方式,那就太好了......
答案 0 :(得分:1)
使用Containable模型行为,您应该可以执行以下操作:
$this->Article->contain();
$categories = $this->Article->Category->find( 'all', array(
'contain' => array(
'Category' => array(
'fields' => array(
'Category.id',
'Category.title'),
'order' => 'Category.id DESC' ),
'Article' => array(
'fields' => array(
'Article.id',
'Article.title'),
'order' => 'Article.id DESC',
'limit' => 4
) ) ) );
这将获得所有类别,每个类别有4篇文章。我有一段时间没有接触过1.3,所以我可能会略微偏离语法,但这就是Cake喜欢限制模型提取的方式。如果您经常使用Containable,可以在模型定义中设置它(如果您希望它适用于所有模型,则可以在AppModel中设置)。