我使用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
}]);
}
答案 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;
}
]);