CakePHP 1.3:类别和文章 - 加载时间考虑

时间:2012-02-03 00:08:41

标签: cakephp categories

编辑 - 我能够使用来自'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中的每个类别

  1. 我调用一个元素来获取相关文章
  2. 此元素使用requestAction调用返回相关文章的Categories控制器操作
  3. 再次,我通过foreach来显示所有相关文章
  4. 对于我拥有的每个类别,都会重复此过程。显然,这不是最好的方法。什么是最好的方法?

    以下是我在文章控制器视图函数中使用的类别:

    $categories = $this->Article->Category->find(
            'all',
            array(
                'fields' => array(
                    'Category.id',
                    'Category.title'
                ),
                'order' => 'Category.id DESC',
                'recursive' => 1,
                'limit' => 1
            )
        );
    

    有了这个,我的负载时间大大减少了,如果我能找到另一种更快的方式,那就太好了......

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中设置)。