获取CakePHP';s可搜索的行为结果,以包含更深的关联

获取CakePHP';s可搜索的行为结果,以包含更深的关联,cakephp,cakephp-1.3,searchable,containable,Cakephp,Cakephp 1.3,Searchable,Containable,我正在尝试使用CakePHP 1.3.5的可包含行为来返回指定模型和关联模型的搜索结果(文章属于用户) 暂时忽略可搜索行为,下面调用find(): $this->Article->find('all', array( 'conditions' => array('Article.is_published' => 1), 'fields' => array('Article.id'), 'contain' => array('User.n

我正在尝试使用CakePHP 1.3.5的可包含行为来返回指定模型和关联模型的搜索结果(文章属于用户)

暂时忽略可搜索行为,下面调用find()

$this->Article->find('all', array(
    'conditions' => array('Article.is_published' => 1),
    'fields' => array('Article.id'),
    'contain' => array('User.name')
));
$this->Article->search($query, array(
    'conditions' => array('Article.is_published' => 1),
    'fields' => array('Article.id'),
    'contain' => array('Article' => array('User.name'))
));
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'))))
执行此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 
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] => 10
        )
        [User] => Array (
            [name] => Author Name
            [id] => 7
        )
    )
    ...
)

这正是人们所期望的。但是,以下对搜索()的调用

$this->Article->find('all', array(
    'conditions' => array('Article.is_published' => 1),
    'fields' => array('Article.id'),
    'contain' => array('User.name')
));
$this->Article->search($query, array(
    'conditions' => array('Article.is_published' => 1),
    'fields' => array('Article.id'),
    'contain' => array('Article' => array('User.name'))
));
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'))))
执行此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 
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
        )
    )
)
这种关联并没有丢失,因为在SearchableBehavior中,
$this->SearchIndex->Article->belongsTo['User']
在调用search()方法中的find()之前和之后都存在并且完好无损

对search()的调用为“contain”的以下所有值返回完全相同的内容:

$this->Article->find('all', array(
    'conditions' => array('Article.is_published' => 1),
    'fields' => array('Article.id'),
    'contain' => array('User.name')
));
$this->Article->search($query, array(
    'conditions' => array('Article.is_published' => 1),
    'fields' => array('Article.id'),
    'contain' => array('Article' => array('User.name'))
));
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'))))
我做错什么了吗?我认为我使用的格式与中所述的相同,而且我在网上没有发现任何提示您必须做一些特殊的操作才能获得包含相关数据的搜索结果


我知道,我可以通过使用附加的find()调用查找用户来轻松实现我想要的结果,但我希望让containable行为像预期的那样工作,并减少不必要的额外数据库查询。

使用containable时,将递归选项设置为“true”


谢谢你的链接!我不知道它存在搜索行为。我以后会查的,有用吗?大概是吧。它可以进行全文搜索,并且可以自定义它对数据的索引方式,但是很明显,我在让它返回关联的模型数据时遇到了这个问题未更改输出。您需要继续嵌套要递归输出的模型