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

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

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']);
}

5

Решение

Вам придется использовать запрос, который использует сопоставления или объединения, чтобы иметь возможность фильтровать не 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;
}

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

15

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]