2016-09-27 6 views
3

Я пытаюсь выполнить поиск по двум связанным столбцам, fname и lname.Cakephp 3 поисковый запрос, с concat

Это не кажется, работает:

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

Если вы связываете имя и фамилию, они должны быть объединены между пробелами.

$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

Это работает. Благодарю. Я также изменил второй параметр вроде (если у кого-то другая проблема): like ($ conc, '%'. $ Terms. '%'); – toast

0

Я думаю, что вам нужно использовать выражения SQL. Попробуйте что-то вроде этого:

->where(function ($exp, $q) use($terms) { 
    $concat = $q->func()->concat([ 
     'fname' => 'identifier', 
     'lname' => 'identifier' 
    ]); 
    return $exp->like($concat, $terms); 
}); 
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)); 
Смежные вопросы