2015-04-20 14 views
5

Tôi có các bảng Các học kỳ, các môn học và một khóa học của các học kỳ liên kết. Tôi muốn tạo ra một chỉ mục hành động trong DisciplinesController với tham số semester_id, liệt kê với paginate chỉ là những gì thuộc về học kỳ với id được truyền trong tham số. Tôi cố gắng này:Điều kiện để phân trang cho thuộcToMany 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

là gì kết quả của thử nghiệm, và những gì xảy ra mà bạn đã hoặc không được mong đợi? – Milner

+0

Lỗi: SQLSTATE [42S22]: Cột không tìm thấy: 1054 Cột không xác định 'semesters_id' trong 'where clause' Vâng ... điều kiện 'chỉ chấp nhận một điều kiện liên quan đến mô hình của bộ điều khiển ... – Luiz

Trả lời

15

Bạn sẽ phải sử dụng một truy vấn có sử dụng phù hợp hoặc tham gia để có thể lọc trên phi 1:1/n-1 hiệp hội.

Bạn có thể làm như vậy bởi một trong hai đi qua một truy vấn trực tiếp đến paginate() phương pháp

// ... 
$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']) 
)); 
// ... 

hoặc bằng cách sử dụng một công cụ tìm tùy chỉnh.

// ... 
$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; 
} 

Xem thêm

+0

Tôi đã giải quyết vấn đề với tùy chọn đầu tiên! ty – Luiz

Các vấn đề liên quan