5

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

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

Каковы были результаты теста, и то, что произошло, что вы или не ожидали? – Milner

+0

Ошибка: SQLSTATE [42S22]: Колонка не найдена: 1054 Неизвестный столбец 'semesters_id' в 'where clause' Ну ... «условия» просто принимают условие, связанное с моделью контроллера ... – Luiz

ответ

15

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

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

+0

Я решил проблема с первым вариантом! ти – Luiz

Смежные вопросы