我正在使用CakePHP 3.x
的书签教程我想添加一个功能,我可以根据标签ID获取属于同一标签的书签。
我在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
与paginate一起使用。
UPDATE2
我刚刚意识到已经有了一个自定义查找程序方法可以执行我想要的操作,除非它不适用于paginate。
答案 0 :(得分:0)
答案在于更改BookmarksController.php中的tags
操作
最初在教程中,标签动作如下所示:
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'));
}