Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cakephp 3搜索插件获取相关字段_Cakephp_Search_Cakephp 3.0 - Fatal编程技术网

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

Cakephp 3搜索插件获取相关字段,cakephp,search,cakephp-3.0,Cakephp,Search,Cakephp 3.0,我正在使用FriendsOfCake的插件来搜索我的表数据。它工作得很好,但现在我不想通过与已创建项的外键匹配的外键来获取相关项 此时,我的查询只返回我搜索的内容对应的行,但如何定义我还希望其他行具有相同的forKey 我的桌子看起来像: ID | forKey | name | content ------ | ------ | ------ | ------ 1 | 1 | value1 | content1 2 | 1 | v

我正在使用FriendsOfCake的插件来搜索我的表数据。它工作得很好,但现在我不想通过与已创建项的外键匹配的外键来获取相关项

此时,我的查询只返回我搜索的内容对应的行,但如何定义我还希望其他行具有相同的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
            }]);
}

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

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

'field' => ['content', 'id', 'name'], 
如果要将搜索绑定到其他表中的相关项,请将控制器搜索中的项包括为包含:

$query = $this->Content
     ->find('search', [
         'search' => $this->request->getQuery()
     ])
      ->contain(['OtherRelatedTable']);
然后将这些添加到模型调用:

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

这有意义吗?

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

$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.'%']);
        });
      }
]);

我还没有使用过这个插件,但是在回调中放置
$query->contain([…])
似乎可以工作?或者在
find('search')
之后添加一个
->-contain
子句?
$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;
                }
    ]);