Я использую CakePHP 3.x
Я следую найденному учебнику bookmarkr Вот а также Вот
Я хочу добавить еще одну функцию, где я могу получать закладки, принадлежащие одному и тому же тегу, на основе идентификатора тега.
Я написал следующую функцию в 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
Я только что понял, что уже есть пользовательский метод поиска, который делает то, что я хочу, за исключением того, что он не работает с paginate.
Ответ заключается в изменении 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'));
}
Других решений пока нет …