Как написать условия для поиска страниц, чтобы получить элементы, основанные на связанном элементе в отношении многих ко многим?

Я использую 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.

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

Другие решения

Других решений пока нет …