CakePHP содержит и разбивает на страницы - глубокие ассоциации не появляются - PullRequest
1 голос
/ 03 октября 2011

Я пытаюсь использовать сдерживаемый в разбивке на страницы.Полный код ниже.

    $this->paginate = array(
        'conditions'=>array(
            'Track.pending'=>0,
            'Track.status'=>1
        ),
        'contain'=>array(
            'Vote'=>array(
                'conditions'=>array(
                    'Vote.created >'=>$start,
                    'Vote.created <='=>$end
                ),
                'fields'=>array(
                    'Vote.vote_type_id',
                    'Vote.id',
                ),
            ),
            'Artist'=>array(
                'Image'=>array(
                    'fields'=>array(
                        'Image.name'
                    )
                ),
                'Genre'=>array(
                    'fields'=>array(
                        'Genre.name'
                    )
                ),
                'fields'=>array(
                    'Artist.name',
                    'Artist.id',
                    'Artist.slug',
                    'Artist.city',
                    'Artist.genre_id'
                )
            )
        ),
        'fields'=>array(
            'Track.id',
            'Track.slug',
            'Track.name',
            'Track.featured',
            'Track.plays',
            'Track.vote_score',
            'Track.vote_week_score',
            'Track.video',
            'Track.status',
            'Track.created'
        ),
        'order'=>$order
    );

Прямые ассоциации (Голосование и Исполнитель) обнаружены, а Изображение и Жанр - нет.Вот генерируемый SQL:

SELECT COUNT(*) AS `count` FROM `tracks` AS `Track` LEFT JOIN `artists` AS `Artist` ON (`Track`.`artist_id` = `Artist`.`id`) WHERE `Track`.`pending` = 0 AND `Track`.`status` = 1

SELECT `Track`.`id`, `Track`.`slug`, `Track`.`name`, `Track`.`featured`, `Track`.`plays`, `Track`.`vote_score`, `Track`.`vote_week_score`, `Track`.`video`, `Track`.`status`, `Track`.`created`, `Artist`.`name`, `Artist`.`id`, `Artist`.`slug`, `Artist`.`city`, `Artist`.`genre_id` FROM `tracks` AS `Track` LEFT JOIN `artists` AS `Artist` ON (`Track`.`artist_id` = `Artist`.`id`) WHERE `Track`.`pending` = 0 AND `Track`.`status` = 1 ORDER BY `Track`.`vote_week_score` DESC LIMIT 20

SELECT `Vote`.`vote_type_id`, `Vote`.`id`, `Vote`.`track_id` FROM `votes` AS `Vote` WHERE `Vote`.`created` > '2011-09-26' AND `Vote`.`created` <= '2011-10-03' AND `Vote`.`track_id` IN (24, 35, 31, 25, 27, 34, 56, 58)

Cake не обнаруживает более глубокие ассоциации.Это ограничение Containable + paginate или я что-то упустил?

Спасибо!

Ответы [ 3 ]

1 голос
/ 31 декабря 2013

Проверьте, есть ли у вас нулевое значение для свойства рекурсии модели.

$this->Post->recursive = 0;

После нескольких часов удаления тряски головы эта строка исправлена ​​для меня

0 голосов
/ 13 февраля 2014

Убедитесь, что вы прикрепили поведение:

$this->ModelName->Behaviors->attach('Containable');
0 голосов
/ 27 сентября 2012

Возможно, проблема в том, что в вашем контроллере используется $, если он установлен в AppController.

Пример:Допустим, ваш контроллер - ProductsController, ваша модель - Product, а таблица базы данных - продукты.Также у вас, вероятно, есть какая-то ассоциация, установленная в вашей модели.

Если вы не устанавливаете $ использование в контроллере, а устанавливаете его в AppController, Cake предполагает, что таблица базы данных работает правильно и работает нормально.Но он не ищет ваш файл модели, так как он не отображается в $ use (тот, что определен в AppController).

Так что он будет работать, если вы напишите в свой контроллер:

public $uses = array('Yourmodel');

Также:

  1. Вам не нужно устанавливать 'recursive', вот почему содержится в существовании
  2. Не забудьте получить посторонние ключи в контейнере ex: Product 'полей '=> Array (' category_id ');Категория 'fields' => 'product_id'
...