2017-07-09 5 views
0

Ich habe 3 Modelle.cakephp 3.4- Paginierung gehört zu vielen Assoziationen

Menüs -> BelongsToMany -> Tags -> BelongsToMany -> Beiträge.

Ich bekomme menu_slug als Input und ich muss die Posts paginieren, die kommen.

Die Abfrage, die ich geschrieben habe funktioniert wie erwartet, aber ich bin nicht in der Lage, es nach Posts Paginieren.

Meine Frage ist:

$posts=$this->Menus->findByMenuSlug($slug)->contain(['Tags'=>function($query){ 
      return $query->contain(['Posts'=>function($qry){ 
       return $qry->select(['id','title','slug','short_description','created'])->where(['status'=>1,'is_deleted'=>2,'is_approved'=>1])->orderDesc('Posts.created'); 
      }]); 
     }])->first();` 

Ich habe keine Ahnung, wie dies mit Paginator zu implementieren. Bitte helfen Sie.

Antwort

0

Hallo, nach langer Suche habe ich die Lösung gefunden. Ich weiß nicht genau, ob dies der beste Weg ist, aber es funktioniert jetzt. Wenn jemand eine bessere Lösung hat Bitte geben Sie das an.

Lösung, die für mich gearbeitet ist:

$this->loadComponent('Paginator'); 

    $this->Paginator->setConfig([ 
     'limit'=>20 
    ]); 

    $menu=$this->Menus->find()->where(['menu_slug'=>$slug])->contain(['Tags'])->first(); 
    $tagIds=[]; 
    if (!empty($menu->tags)){ 
     foreach ($menu->tags as $tag) { 
      $tagIds[]=$tag->id; 
     } 
    } 

    $posts=[]; 

    if (!empty($tagIds)){ 
     $posts=$this->Posts->find()->contain(['Tags'=>function(Query $query)use($tagIds){ 
      return $query->where(['Tags.id IN'=>$tagIds]); 
     }])->orderDesc('created'); 
     $posts=$this->paginate($posts); 
    } 

    $this->set(compact('menu','posts'));`