CakePHP 1.3: категории и статьи - время загрузки - PullRequest
1 голос
/ 03 февраля 2012

РЕДАКТИРОВАТЬ - мне удалось исправить эту проблему с помощью кода из 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...

В настоящее время я выполняю это, используя следующий код в моем индексе..ctp

foreach($categories as $category){
    echo $category['Category']['title'];
    $this->element('related_articles', array('categoryID'=>$category['Category']['id']));
}

По сути, я прохожу все доступные категории и для каждой категории в foreach

  1. Я вызываю элемент для получения связанных статей
  2. Этот элементиспользует requestAction для вызова действия контроллера категорий, которое возвращает связанные статьи
  3. Еще раз, я иду через foreach для отображения всех связанных статей

Этот процесс повторяется для каждой имеющейся у меня категории.Очевидно, что это не лучший способ сделать это.Какой самый лучший способ?

Вот то, что я использую в своей функции просмотра статей контроллера для категорий:

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

При этом мое время загрузки значительно уменьшается, и если я найду другой более быстрый способ, который был быбольшой ...

1 Ответ

1 голос
/ 03 февраля 2012

Используйте модель поведения 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, если хотите, чтобы он применялся ко всем моделям).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...