$bookmarks = $this->Bookmarks->find('tagged', [
テーブルのfindメソッドの第一引数が重要。
たとえば上記のようにBookmarks->find('tagged',のようになっているときは、
BookmarksTableクラスのfindTaggedメソッドを探しに行く。
ここで見つからないときUnknown finder method ("tagged")とエラーが出る。
見つかった時はfindTagged()に第二引数であるオプションを渡して結果をもらう。
ここから補足。
今回は、指定したタグが付いているブックマークの一覧を表示するためにタグ付きのブックマークを絞り込みたい。
そのためにはControllerはTableクラスに依頼し、絞り込んだ結果を返して貰いたい。
// タグ付きのブックマークを探すために BookmarksTable を使用
$bookmarks = $this->Bookmarks->find('tagged', [
'tags' => $tags
]);
これは、BookmarksControllerがBookmarksTableに依頼する。なぜならTableがDBとの通信を担当するから。
findTaggedメソッドに指定したタグを渡すことでBookmarksTableはブックマークを絞りこめるようになる。
さて、次はTableクラスの処理。
public function findTagged(Query $query, array $options)
{
まずここは、呼び出したクエリインスタンスと先程の第二引数(compact('tags'))が渡されることを意味する。
$bookmarks = $this->find()->select(['id', 'url', 'title', 'description']);
表示したい項目一覧を設定する。SELECT ID,URL, ...のような感じ
if (empty($options['tags'])) {
第二引数に何も渡されていなかったとき=タグが何も指定されていない時
$bookmarks->leftJoinWith('Tags')->where(['Tags.title IS' => null]);
タグがNULLの行を検索
} else {
$bookmarks->innerJoinWith('Tags')->where(['Tags.title IN ' => $options['tags']]);
指定したタグのどれかに合致する行を検索
}
return $bookmarks->group(['Bookmarks.id']);
IDでGROUP BYしたものを返却
}