私は、CakePHP 1.3.5 の検索可能な動作と包含可能な動作を使用して、指定されたモデルと関連するモデル (記事の所属ユーザー)の検索結果を返そうとしています。
検索可能な動作をしばらく無視して、次のfind()呼び出し:
$this->Article->find('all', array(
'conditions' => array('Article.is_published' => 1),
'fields' => array('Article.id'),
'contain' => array('User.name')
));
次の SQL クエリを実行します。
SELECT `Article`.`id`, `User`.`name`, `User`.`id` FROM `articles` AS `Article` LEFT JOIN `users` AS `User` ON (`Article`.`user_id` = `User`.`id`) WHERE `Article`.`is_published` = 1
次の配列を返します。
Array (
[0] => Array (
[Article] => Array (
[id] => 10
)
[User] => Array (
[name] => Author Name
[id] => 7
)
)
...
)
これはまさに期待されていることです。ただし、次のsearch()の呼び出し:
$this->Article->search($query, array(
'conditions' => array('Article.is_published' => 1),
'fields' => array('Article.id'),
'contain' => array('Article' => array('User.name'))
));
次の SQL クエリを実行します。
SELECT `Article`.`id` FROM `search_index` AS `SearchIndex` LEFT JOIN `articles` AS `Article` ON (`SearchIndex`.`model` = 'Article' AND `SearchIndex`.`association_key` = `Article`.`id`) WHERE `Article`.`is_published` = 1 AND MATCH(`SearchIndex`.`data`) AGAINST('search term' IN BOOLEAN MODE) AND `Article`.`id` IS NOT NULL
そして、この配列を返します:
Array (
[0] => Array (
[Article] => Array (
[id] => 9
)
)
...
)
search() メソッドを見ると、 が返されてい$this->SearchIndex->find('all', $findOptions);
ます。$findOptionsには以下が含まれます。
Array (
[conditions] => Array (
[Article.is_published] => 1
[0] => MATCH(SearchIndex.data) AGAINST('search term' IN BOOLEAN MODE)
)
[fields] => Array (
[0] => Article.id
)
[contain] => Array (
[Article] => Array (
[0] => User.name
)
)
)
$this->SearchIndex->Article->belongsTo['User']
SearchableBehavior 内では、search() メソッド内での find() の呼び出しの直前と直後に存在し、無傷であるため、関連付けが途中で失われることはありません。
search() の呼び出しは、次の 'contain' のすべての値に対してまったく同じものを返します。
array('Article' => array('User.name'))
array('Article' => array('User'))
array('Article' => array('User' => array()))
array('Article' => array('User' => array('fields' => array('User.name'))))
array('Article' => array('User' => array('fields' => array('name'))))
私は何か間違ったことをしていますか?CakePHP のドキュメントで指示されているのと同じ形式を使用していると思いますが、関連するデータで検索結果を取得するために何か特別なことをしなければならないことを示唆するものはオンラインで見つかりませんでした。
find() への追加の呼び出しを使用してユーザーを検索するだけで、必要な結果を簡単に達成できることはわかっていますが、収容可能な動作を想定どおりに機能させ、不要な余分なデータベースクエリを削減したいと考えています。