2017-11-29 4 views
0

Was ich versuche zu erreichen, ist ziemlich einfach, aber ich werde es nicht schaffen, den richtigen Weg zu finden.CakePHP 3 Ergebnis paginieren

Ich habe eine Produkttabelle in meiner Datenbank. Jedes Produkt hat viele Bilder und Farben und gehört zu einer oder mehreren Kategorien.

Ich versuche eine Aktion zu erstellen, die die ID einer Kategorie empfängt und die Produkte, die sie enthält, paginiert. Diese

ist, was mein Code wie jetzt aussieht, mit den beiden unterschiedlichen Ansätze, die ich versucht habe:

$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); 

Die Variable $paginatorQuery nicht richtig filtern (ich wusste, dass es nicht, weil, wie fehlerhaft, dass Logik ist, aber beschlossen, es nur für den Fall zu versuchen), stattdessen gibt es, was zu erwarten wäre (alle vorhandenen Produkte, und in dem Fall, dass das Produkt der Kategorie mit der entsprechenden ID gehört, enthält das Produkt).

Die kommentierte Zeile $catProd = $catProd->products weist der Variablen $catProd die gewünschte Ergebnismenge zu, aber ich kann das nicht paginieren. Ich denke daran, eine manuelle Paginierung zu implementieren, indem ich Limits zuweise und mit dieser Abfrage beginne, aber ich denke, da muss etwas fehlen, das mir den Ärger ersparen würde.

Danke!

Antwort

2

Ihre $paginatorQuery sollte matching für die Kategorien verwenden, nicht contain. So etwas wie diese (nicht getestet):

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

Siehe filtering by associated data für weitere Details.

+0

Danke, das hat den Trick gemacht. Wenn ich mich richtig erinnere, hatte ich vorher versucht, die Übereinstimmung zu verwenden, aber die Anweisung use verpasst, so dass '$ categoryId' nicht definiert wurde. – porjolovsky