【问题标题】:Getting CakePHP's searchable behavior results to contain deeper associations让 CakePHP 的可搜索行为结果包含更深层次的关联
【发布时间】:2010-12-09 22:27:38
【问题描述】:

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

暂时忽略可搜索行为,以下对 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
        )
    )
)

关联并没有丢失,因为在 SearchableBehavior 中,$this->SearchIndex->Article->belongsTo['User'] 在 search() 方法中调用 find() 之前和之后立即存在并且完好无损。

对于以下所有'contain'值,对 search() 的调用返回完全相同的内容:

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'))))

我做错了吗?我想我使用的格式与the CakePHP documentation 中指示的格式相同,并且我没有在网上找到任何建议您必须执行一些特殊操作才能获得包含相关数据的搜索结果。

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

【问题讨论】:

  • 感谢您的链接!我不知道它存在搜索行为。稍后我会检查它,有用吗?
  • 据说。它进行全文搜索,并且可以自定义如何索引您的数据,但我显然在让它返回关联的模型数据时遇到了这个问题。

标签: cakephp cakephp-1.3 searchable containable


【解决方案1】:

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

$this->Model->Behaviors->attach("Containable",array("recursive"=>true));

【讨论】:

  • 在调用 search() 之前放置 $this->Article->Behaviors->attach("Containable", array("recursive" => true)); 不会改变输出。
  • 你需要继续嵌套你想要递归输出的模型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
相关资源
最近更新 更多