Cakephp 3搜索插件获取相关字段
我正在使用FriendsOfCake的插件来搜索我的表数据。它工作得很好,但现在我不想通过与已创建项的外键匹配的外键来获取相关项 此时,我的查询只返回我搜索的内容对应的行,但如何定义我还希望其他行具有相同的forKey 我的桌子看起来像: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
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;
}
]);