2014-11-02 2 views
0

Я использую CakePHP 3.xКак написать условия поиска paginate для извлечения элементов на основе связанного элемента во многих отношениях?

Я после bookmarkr учебника нашел here и here

Я хочу добавить еще одну функции, где я могу принести закладки, которые принадлежат к той же метке на основе тега ид.

я написал следующую функцию в BookmarksController

/** 
* Index view by tag method 
* 
* @return void 
*/ 
    public function index_by_tag($tag_id) { 
     $conditions = [ 
      'Bookmarks.public' => true, 
     ]; 
     $this->paginate = [ 
      'conditions' => $conditions, 
      'contain' => [ 
       'Users' => function ($q) { 
        return $q 
         ->select(['username', 'id']); 
       } 
      ], 
      'order' => [ 
       'Bookmarks.updated' => 'desc', 
       'Bookmarks.id' => 'desc' 
      ] 
     ]; 
     $this->set('bookmarks', $this->paginate($this->Bookmarks)); 
    } 

Как я должен изменять $conditions таким образом я могу получить только те закладки, которые принадлежат к той же метке?

Имейте в виду, что закладки и теги находятся во многих отношениях.

Update1

Я нашел эту идею использования matching. Который получает меня, что я хочу, если я использую query builder.

См http://book.cakephp.org/3.0/en/orm/query-builder.html#using-matching-when-finding-results

Однако, нет никакого упоминания о том, как использовать matching с постраничной.

UPDATE2

Я просто понял, что это уже пользовательский метод поиска, который делает то, что я хочу, за исключением того, что он не работает с постраничной.

http://book.cakephp.org/3.0/en/tutorials-and-examples/bookmarks/intro.html#getting-bookmarks-with-a-specific-tag

ответ

0

Ответ заключается в изменении tags действия в BookmarksController.php

Первоначально в учебнике, внешний вид тегов действие, как это:

public function tags() { 
    $tags = $this->request->params['pass']; 

    $bookmarks = $this->Bookmarks->find('tagged', [ 
     'tags' => $tags 
    ]); 

    $this->set(compact('bookmarks', 'tags')); 
} 

Изменение заключается в изменении как для определения $bookmarks.

public function tags() { 
    $tags = $this->request->params['pass']; 

    // you can call custom finder methods within paginate 
    // the link is at http://book.cakephp.org/3.0/en/controllers/components/pagination.html#using-controller-paginate 
    // scroll down just a bit to look at custom finder methods 
    $this->paginate = [ 
     'finder' => [ 
      'tagged' => [ 
       'tags' => $tags 
      ] 
     ] 
    ]; 

    $bookmarks = $this->paginate($this->Bookmarks); 

    $this->set(compact('bookmarks', 'tags')); 
} 

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

  • Нет связанных вопросов^_^