У меня есть таблицы 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; }
Смотрите также