目前,我正在实施friendsofcake搜索插件(版本1.2.3)。除了我想要连接两个这样的字段外,一切都按原样运行:
$this->searchManager()
->add('id', 'Search.Value')
->add('q', 'Search.Like', [
'before' => true,
'after' => true,
'field' => [$this->aliasField('username'), $this->aliasField('name')]
])
->add('q', 'Search.Callback', [
'callback' => function ($query, $args, $manager) {
return $query->select(['name' => $query->func()->concat(
['first_name' => 'identifier', ' ' , 'last_name' => 'identifier']
)]);
}
]);
由于我的数据库表将first_name和last_name分开存储,我希望搜索插件搜索这两个字段的组合(名称)。上面的代码忽略了类似的clausule,当我在回调中打印查询时,它似乎忽略了类似的操作。有谁知道如何在这个搜索插件中连接两个字段?
答案 0 :(得分:2)
您无法添加具有相同名称(q
)的多个过滤器,后者将覆盖前者,它们将不会合并。
您还必须在回调中自己构建条件,即为username
和name
添加条件。如果要使用HAVING
子句中的聚合列进行匹配,也必须使用SELECT
,或者必须在WHERE
条件中构建聚合列 - 具体取决于DBMS你正在使用,WHERE
可能会更快(虽然可能不是在使用LIKE
时,这使得无法使用索引,即无论如何都会触及每一行)。
以下是使用HAVING
的基本示例:
'callback' => function ($query, $args, $manager) {
return $query
->select([
$this->aliasField('username'),
'name' => $query->func()->concat([
'first_name' => 'identifier',
' ' ,
'last_name' => 'identifier'
])
])
->having([
'OR' => [
$this->aliasField('username') . ' LIKE' => '%' . $args['q'] . '%',
'name LIKE' => '%' . $args['q'] . '%'
]
]);
}
*未经测试的例子