Условия для разбивки на страницы для containsToMany 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']);
}

person Luiz    schedule 20.04.2015    source источник
comment
Каковы были результаты вашего теста, и что произошло, чего вы ожидали или не ожидали?   -  person Milner    schedule 20.04.2015
comment
Ошибка: SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец «semesters_id» в «предложении where» Ну… «условия» просто принимают условие, связанное с моделью контроллера...   -  person Luiz    schedule 20.04.2015


Ответы (1)


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

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

person ndm    schedule 20.04.2015