2016-09-27 37 views
3

2つの結合カラム、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

ではこれが動作します。ありがとう。私はまた、2番目のlikeパラメータを(他の誰かが同じ問題を抱えている場合に)変更しました: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)); 
関連する問題