2016-05-19 37 views
0

現在、friendsofcake検索プラグイン(バージョン1.2.3)を実装しています。組み合わせたこれらの二つのフィールドのための検索プラグインを検索していることFIRST_NAMEとLAST_NAME私のデータベーステーブルに格納するので検索プラグインの連結フィールドCakephp 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'] 
       )]); 
      } 
     ]); 

分離欲しい(名前:すべては、それは私はこのような二つのフィールドをCONCATしたい例外であるべきな働き)。上記のコードは、同様のclausuleを無視し、コールバック内でクエリを出力すると、同様の操作を無視するようです。誰かがこの検索プラグイン内で2つのフィールドをどのように連結できるか知っていますか?

答えて

2

複数のフィルタを同じ名前(q)で追加することはできません。後者は前者を上書きし、マージされません。

コールバックで自分で条件を構築する必要があります。すなわち、usernamenameの条件を追加する必要があります。 SELECT句の集約カラムを使用して一致させる場合は、HAVINGを使用するか、WHERE条件で集約カラムを作成する必要があります(使用しているDBMSによっては、より速いかもしれませんがLIKEを使用すると、インデックスを使用することが不可能になります。つまり、1行に1つずつタッチします。ここで

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'] . '%' 
      ] 
     ]); 
} 

*テストされていない例

+0

データが実際の結果に補間されているので、このソリューションは、SQLインジェクションの権利のために安全ではないでしょうか? – markvdlaan93

+0

@ markvdlaan93あなたは、データが 'key => value set 'の値として別々に設定されているので、右辺の値が条件のように安全であることを意味します。正確には、値は準備されたクエリの中で束縛されたパラメータとして設定されます。 – ndm

+0

@ markvdlaan93プレースホルダを表示する '$ query-> sql()'をデバッグすることでチェックできます。もちろん、何かを注入してテストすることもできます:) – ndm

関連する問題