CakePHP: разбиение на страницы с ограничениями запроса для связанного поля hasMany? - PullRequest
0 голосов
/ 20 сентября 2011

Похоже на этот вопрос - но из-за моей неумелости с CakePHP, я не могу понять это. Вот мои настройки.

У меня есть название модели User, в котором много Comments. Я хочу список всех невидимых Users хотя бы с одним Comment. У нашего контроллера есть методы, настроенные для установки records как $this->paginate() без каких-либо значений, переданных ему; вместо этого $paginate var настроен на условия и тому подобное.

class UsersController extends AppController {
    var $name = 'Users';
    var $paginate;

    function new_users() {
        $this->User->recursive = 1;
        $this->paginate['User']['contain'][] = 'Comment';
        $this->paginate['User']['order'] = 'User.DateCreated DESC';

        $conditions = array();
        // Get invisible users...
        $conditions[] = array('User.Status = ?' => 'Invisible');
        $conditions[] = array('User.Enabled' => true);
        // ...with at least one active comment
        $conditions[] = array('Comment.Status' => 'Active');

        // Load these conditions and fire pagination to render the view
        $this->paginate['User']['conditions'] = $conditions;
        $this->set('records', $this->paginate());
    }
} 

Я настолько новичок в CakePHP, что многие из этих вещей до сих пор у меня над головой. Я просто хочу список Users с активным Comments. Прямо сейчас, этот запрос выводит меня 0 пользователей . Если я уберу строку, касающуюся Comment.Status, запрос пройдет, но я получу все невидимые Users независимо от того, есть ли у них комментарии.

Везде в сети, где я видел вызов paginate(), ему передавались какие-то вещи (например, paginate('User', array('Comment.Status' => 'Active')), который я пробовал и ничего не получаю).

Редактировать : Я получил следующий код, хотя очиститель все еще дает мне те же результаты.

$this->paginate = array(
  'conditions' => array(
    'User.Status' => 'Invisible',
    'User.Enabled' => true,
  ),
  'contain' => array(
    'Comment' => array(
      'conditions' => array(
        'Comment.Status' => 'Active',
      )
    )
  ),
  'recursive' => 1,
  'order' => 'User.DateCreated DESC',
);
$data = $this->paginate('User');

1 Ответ

2 голосов
/ 20 сентября 2011

Я обычно использую изменения пагината на лету, хе-хе.Вот пример кода.

$this->paginate = array(
    'conditions' => array('Recipe.title LIKE' => 'a%'),
    'limit' => 10    );
$data = $this->paginate('Recipe');

Здесь вы можете прочитать больше о настройке контроллера для нумерации страниц.Но если у вас уже есть связи в модели (hasMany и т. Д.), Данные автоматически выбираются, если вы ставите рекурсивную единицу без необходимости содержать (вы все равно можете использовать ее для получения только тех данных, которые вам нужны).Пример того, как он будет выглядеть для вас:

$this->paginate = array(
    'conditions' => array(
         'User.Status' => 'Invisible',
         'User.Enabled' => true
    ),
    'contain' => array('Comment' => array(
           'conditions' => array('Comment.Status' => 'Active')
    )),
    'recursive' => 1,
    'order' => 'User.DateCreated DESC'
);
$data = $this->paginate('User');

Это то, что вы положили в свой пост.Если вы вставите SQL-запрос того, что вы хотите, я могу помочь вам больше.Кроме того, попробуйте проверить вывод sql, чтобы знать, что-то не так в условиях.если у вас нет и вы не знаете, как поместить вывод sql, просто сделайте это.

var_dump($this->User->getQuery(
    'conditions' => array(
         'User.Status' => 'Invisible',
         'User.Enabled' => true,
         'Comment.Status' => 'Active'
    ),
    'contain' => 'Comment',
    'order' => 'User.DateCreated DESC'
));

Надеюсь, это поможет вам, если нет, оставьте мне комментарий.

РЕДАКТИРОВАТЬ : Это то, что вам нужно сделать, чтобы получить то, что вы хотите.: D Измените таблицу и условия в соответствии с вашими потребностями.

$this->paginate = array(
    'conditions' => array(
         'User.Status' => 'Invisible',
         'User.Enabled' => true
    ),
    'joins' =>  array(
        array(
          'table' => 'name_of_comment_table',
          'alias' => 'Comment',
          'type' => 'inner',
          'conditions' => array(
              'Comment.user_id = User.id',
              'Comment.Status' => 'Active'
           )
         )
     ),
    'contains' => array('Comment'),
    'group' => 'User.id',
    'recursive' => 1,
    'order' => 'User.DateCreated DESC'
);
$data = $this->paginate('User');
...