搜索插件Cakephp 3中的Concat字段

时间:2016-05-19 20:57:47

标签: php cakephp cakephp-3.0

目前,我正在实施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,当我在回调中打印查询时,它似乎忽略了类似的操作。有谁知道如何在这个搜索插件中连接两个字段?

1 个答案:

答案 0 :(得分:2)

您无法添加具有相同名称(q)的多个过滤器,后者将覆盖前者,它们将不会合并。

您还必须在回调中自己构建条件,即为usernamename添加条件。如果要使用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'] . '%'
            ]
        ]);
}

*未经测试的例子