2016-09-27 3 views
3

Ich versuche, eine Suche nach zwei verbundenen Spalten, fname und lname.CakePHP 3 Suchabfrage, mit concat

Dies scheint nicht zu funktionieren:

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]); 

Irgendwelche Ideen?

Danke.

Antwort

3

Wenn Sie Vor- und Nachnamen verketten, sollten sie mit Zwischenräumen verkettet werden.

$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

Dies funktioniert. Vielen Dank. Ich habe auch den zweiten like-Parameter geändert, um (falls jemand anderes das gleiche Problem hat): like ($ conc, '%'. $ Terms. '%'); – toast

0

Ich denke, Sie müssen SQL-Ausdrücke verwenden. Versuchen Sie etwas wie folgt:

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

Sie müssen Abfrageausdruck verwenden, aber dies kann nicht in einem Paginierungsarray erfolgen.

So Nach ndn Vorschlag hier ist, wie ich tun würde,

einen benutzerdefinierten finder erstellen. In Ihrer UsersTable Datei

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; 
} 

-Controller

$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));