Cakephp 3搜索查询,带concat

时间:2016-09-27 12:12:43

标签: cakephp cakephp-3.0 query-builder cakephp-3.x

我试图在两个已加入的列fname和lname上执行搜索。

这似乎不起作用:

Object of class Cake\Database\Expression\FunctionExpression could not be converted to string

$users = $this->Users->find();
$users->select(['id', 'fname', 'lname'])
    ->where([$users->func()->concat(['fname', 'lname']).' LIKE' => $terms]);

有什么想法吗?

感谢。

3 个答案:

答案 0 :(得分:4)

如果你要连接名字和姓氏,它们应该用中间的空格连接。

$users->select(['id', 'fname', 'lname'])
      ->where(function ($exp, $query) use ($terms) {
         $conc = $query->func()->concat([
            'fname' => 'identifier', ' ',
            'lname' => 'identifier'
         ]);
         return $exp->like($conc, $terms);
       });

答案 1 :(得分:0)

我认为你必须使用SQL表达式。尝试这样的事情:

->where(function ($exp, $q) use($terms) {
    $concat = $q->func()->concat([
        'fname' => 'identifier', 
        'lname' => 'identifier'
    ]);
    return $exp->like($concat, $terms);
});

答案 2 :(得分:0)

Yu必须使用查询表达式,但这不能在分页数组中完成。

所以在这里按照ndn的建议我会怎么做

创建自定义查找程序。在您的UsersTable文件中

public function findByKeyword(Query $query, array $options)
{
    $keyword = $options['keyword'];
    $query->where(
        function ($exp, $q) use($keyword){
            $conc = $q->func()->concat([
                'Users.fname' => 'literal', ù
                'Users.lname' => 'literal']);
            return $exp
                ->or_([
                    'Users.fname LIKE' => "%$keyword%",
                    'Users.lname LIKE' => "%$keyword%",
                ])
                ->like($conc, "%$keyword%");
            }
        );
    return $query;
}

<强>控制器

$this->paginate = [
        'finder' => [
            'byKeyword' => [
                'keyword' => $this->request->data['Users']['keyword']
        ]],
        'conditions' => $limo,  // this will merge your $limo conditions                  
                                // with the ones you set in the custom finder
        'order'= > ['Users.fname desc'],
    ];

$this->set('userlist', $this->paginate($this->Users));