如何为paginate finder编写条件,以便根据多对多关系中的关联项检索项目?

时间:2014-11-02 05:36:31

标签: php cakephp cakephp-3.0

我正在使用CakePHP 3.x

我正在关注找到herehere

的书签教程

我想添加一个功能,我可以根据标签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。

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

1 个答案:

答案 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'));
}