いろいろ備忘録

雑記です。

Unknown finder method とは

$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したものを返却

 

}