Условия для разбивки на страницы, принадлежащие ToMany CakePHP 3

У меня есть таблицы Semesters, Disciplines и jointTable Semesters_Disciplines. Я хочу создать индекс действия в DisciplinesController с параметром semester_id, который перечисляет с paginate только дисциплины, что принадлежит семестру, с идентификатором, переданным в параметре. Я попробовал это:

public function index($semester_id) { $options = ['semester_id' => $semester_id]; $this->paginate = ['conditions' => $options]; $this->set('disciplines', $this->paginate($this->Disciplines)); $this->set('_serialize', ['disciplines']); } 

Вам нужно будет использовать запрос, который использует совпадения или объединения, чтобы иметь возможность фильтровать ассоциации не 1:1 / n-1 .

Вы можете сделать это, передав запрос непосредственно в метод paginate()

 // ... $this->set('disciplines', $this->paginate( $this->Disciplines ->find() ->matching('Semesters', function(\Cake\ORM\Query $q) use ($semester_id) { return $q->where([ 'Semesters.id' => $semester_id ]); }) ->group(['Disciplines.id']) )); // ... 

или с помощью пользовательского поиска.

 // ... $this->paginate = [ 'finder' => [ 'semesters' => [ 'semester_id' => $semester_id ] ] ]; $this->set('disciplines', $this->paginate($this->Disciplines)); // ... 
 // DisciplinesTable public function findSemesters(\Cake\ORM\Query $query, array $options) { $query ->matching('Semesters', function(\Cake\ORM\Query $q) use ($options) { return $q->where([ 'Semesters.id' => $options['semester_id'] ]); }) ->group(['Disciplines.id']); return $query; } 

Смотрите также

  • Cookbook> Pagination> Использование контроллера :: paginate ()
  • Поваренная книга> Получение данных и наборов результатов> Пользовательские методы поиска
  • Поваренная книга> QueryBuilder> Фильтрация по связанным данным
  • Cookbook> QueryBuilder> Добавление объединений