2017-11-29 1 views
0

내가 이루고자하는 목표는 꽤 간단하지만 올바른 방법을 찾아 낼 수는 없다.CakePHP 3 결과 페이지 매기기

내 데이터베이스에 Products 테이블이 있습니다. 각 제품에는 많은 이미지 및 색상이 있으며 하나 이상의 카테고리에 속합니다.

카테고리의 ID를 받고 액션이 포함 된 제품을 반환하는 작업을 만들려고합니다.

이 변수 $paginatorQuery가 제대로 필터링하지 않습니다
$paginatorQuery = $this->Categories->Products->find('all', [ 
     'contain' => [ 
      'Categories' => [ 
       'conditions' => [ 
        'category_id' => $categoryId 
       ] 
      ], 
      'Colors', 
      'Images' 
     ], 
     'conditions' => $conditionArray, 
     'order' => [ 
      $session->read('productSort.field') => $session->read('productSort.direction') 
     ], 
    ]); 

    $catProd = $this->Categories->get($categoryId, [ 
     'contain' => [ 
      'Products' => [ 
       'Colors', 
       'Images', 
       'conditions' => $conditionArray, 
       'sort' => [ 
        $session->read('productSort.field') => $session->read('productSort.direction') 
       ], 
      ] 
     ], 
    ]); 

    // $catProd = $catProd->products; 

    $products = $this->paginate($paginatorQuery); 

(I가이 것 때문이 아니라 방법을 알고 :

이 내 코드는 내가 해봤 두 가지 다른 방법으로, 지금 모습입니다 논리적이지만, 다만 그것을 시도하기로 결심했다면, 예상되는 것 (기존의 모든 제품, 해당 제품이 해당 ID가있는 카테고리에 속한 경우 제품에 포함되어 있음)을 반환합니다.

주석 달린 줄 $catProd = $catProd->products은 변수 $catProd에 원하는 결과 집합을 할당하지만 그 번호를 매길 수는 없습니다. 한계를 지정하고 수동으로 페이지 매김을 구현하는 방법을 생각 중이지만 문제가되는 부분을 놓치고있는 뭔가가 있어야한다고 생각합니다.

감사합니다.

답변

2

$paginatorQuerymatchingcontain이 아니라 matching으로 사용해야합니다. 이와 같이 (테스트되지 않음) :

$paginatorQuery = $this->Categories->Products->find('all', [ 
    'contain' => [ 
     'Colors', 
     'Images' 
    ], 
    'conditions' => $conditionArray, 
    'order' => [ 
     $session->read('productSort.field') => $session->read('productSort.direction') 
    ], 
]) 
->matching('Categories', function (Query $q) use ($categoryId) { 
    return $q->where(['Categories.id' => $categoryId]); 
}); 

자세한 내용은 filtering by associated data을 참조하십시오.

+0

고마워요, 그 속임수를했습니다. 만약 내가 정확하게 기억한다면, 나는 이전에 일치를 사용하려했지만 use 문을 놓쳤다. 그래서'$ categoryId'가 정의되지 않았다. – porjolovsky

관련 문제