Cakephp 3搜索插件获取相关字段

时间:2017-05-10 08:06:00

标签: cakephp search cakephp-3.0

我使用FriendsOfCake中的Easy model searching插件并使用它来搜索我的表格数据。它的工作非常好,但现在我不想通过与创建项目的外键匹配的外键来获取相关项目。

此时我的查询只返回我搜索的内容的行,但是如何定义我还希望其他行具有相同的forKey?

我的表格如下:

ID     | forKey | name    | content 
------ | ------ | ------  | ------
1      | 1      | value1  | content1  
2      | 1      | value2  | content2
3      | 2      | value3  | content3

控制器内的搜索功能:

 $query = $this->Content
         ->find('search', [
             'search' => $this->request->getQuery()
         ]);

在控制器表中搜索设置:

public function initialize(array $config) {
    parent::initialize($config);

    // Search
    $this->addBehavior('Search.Search');

    // Setup search filter using search manager

    $this->searchManager()
//            ->value('id')
        ->add('q', 'Search.Like', [
            'before' => true,
            'after' => true,
            'fieldMode' => 'OR',
            'comparison' => 'LIKE',
            'wildcardAny' => '*',
            'wildcardOne' => '?',
            'field' => ['content'],
        ])
        ->add('foo', 'Search.Callback', [
            'callback' => function ($query, $args, $filter) {
                // Modify $query as required
            }]);
}

3 个答案:

答案 0 :(得分:2)

我不确定您是否尝试在多个字段中查找符合条件的内容,或者您​​是否尝试在相关表格中找到它。

要从调用表中搜索更多字段,只需添加逗号分隔:

'field' => ['content', 'id', 'name'], 

如果您希望将搜索绑定到其他表中的相关项,请将控制器搜索中的相关项包含在内:

$query = $this->Content
     ->find('search', [
         'search' => $this->request->getQuery()
     ])
      ->contain(['OtherRelatedTable']);

然后将其添加到模型调用中:

'field' => ['content', 'id', 'name', 'OtherRelatedTable.id'],

这有意义吗?

答案 1 :(得分:0)

如果您尝试使用关联的模型进行过滤,请使用回调选项或自定义查找器:

$searchManager->add('related_table_field', 'Search.Callback', [
    'callback' => function ($query, $args, $filter) {
        $related_table_field = $args['related_table_field'];
        $query->matching('RelatedTable', function ($q) use($related_table_field) {
            return $q->where(['RelatedTable.related_table_field LIKE' => '%'.$related_table_field.'%']);
        });
      }
]);

答案 2 :(得分:0)

$this->add('q', 'Search.Like', [
                'before' => true,
                'after' => true,
                'fieldMode' => 'OR',
                'comparison' => 'LIKE',
                'wildcardAny' => '*',
                'wildcardOne' => '?',
                'field' => ['firstname', 'username']
            ])
            ->add('table_name.address', 'Search.Callback', [
                'callback' => function ($query, $args, $filter) {
                    $query->matching('TableModel', function ($q) use($args) {
                                return $q->where(['TableModel.address' => $args['table_name.address']]);
                            });
                    return $query;
                }
    ]);