2016-07-21 4 views
0

私はphalcon-datatablesを使用しています。これはPhalcon PHPdatatablesアダプターです。Phalconのデータ型アダプターは、状態が正常に動作しません。

私は例えば、私のQueryBuilderにWHERE条件を持っている:

use \DataTables\DataTable; 

class TestController extends \Phalcon\Mvc\Controller { 
    public function indexAction() { 
     if ($this->request->isAjax()) { 
      $builder = $this->modelsManager->createBuilder() 
          ->columns('id, name, email, age') 
          ->from('Example\Models\User'); 
          ->where("age = :age:", array("age" => 30)) 

      $dataTables = new DataTable(); 
      $dataTables->fromBuilder($builder)->sendResponse(); 
     } 
    } 
} 

しかし、私はグローバル検索を使用しています問題を抱えています。 where条件は無視され、検索条件付きのデータベースにすべてのレコードが表示されます。

私が列の検索を使用しているとき、それはうまくいきます。我々はすべての列を取得する必要がありグローバルな検索と、このライブラリのために>Githubライン21-23

グローバル検索にorWhereを使用 -

は、私はこの問題は、このクラスであると思います。

$this->bind('global_search', function($column, $search) { 
     $this->builder->orWhere("{$column} LIKE :key_{$column}:", ["key_{$column}" => "%{$search}%"]); 
    }); 

そして、列検索を使用しています。

$this->bind('column_search', function($column, $search) { 
    $this->builder->andWhere("{$column} LIKE :key_{$column}:", ["key_{$column}" => "%{$search}%"]); 
}); 

だから、これはQueryBuilderのwhere条件で列の検索が機能する理由だと思います。これがグローバル検索が機能しない理由です。

ライブラリ内でこの問題を解決する考えはありますか?

EDIT:

私は解決策を持っていると思います。私はかごにかっこをかける必要があります。

しかし、phalconでこのクエリを行うにはどうすればよいですか?

SELECT * 
FROM `users` 
WHERE age = 30 
AND (name like '%d%' 
OR email like '%d%' 
OR login like '%d%') 
+0

独自のクラス 'MyQueryBuilder extends QueryBuilder'で' QueryBuilder'を拡張することができます。そして、あなたのカスタムフィックスで 'getResponse()'メソッドを上書きします。 – Timothy

+0

ファルコンの公式拡張ではありません。このリポジトリに問題を書いたり、PRをしたりしてください。 – Juri

+0

修正がありません修正するためにいくつかの助けが必要です – John

答えて

1

私は私の問題を解決しました。私は誰にでも役立つことができます。

$this->bind('global_search', function($column, $search) { 
    // Add OR if isn't the first condition 
    $this->condition .= $this->first_search ? "{$column} LIKE :key_{$column}:" : " OR {$column} LIKE :key_{$column}:"; 
    $this->binding["key_{$column}"] = "%{$search}%"; 
    $this->first_search = false; 
}); 

// Add andWhere condition for global_search if needed 
if(!empty($this->condition) && !empty($this->binding) && !$this->first_search){ 
    $this->builder->andWhere($this->condition, $this->binding); 
    $this->first_search = true; 
} 

I:

private $condition = '';  // member condition for the builder 
    private $binding = array(); // member bind for the builder 
    private $first_search = true; // flag to detect first search 

とてgetResponse()関数でが、私はこのコードを追加:私はクラス内の3人のメンバーを宣言し

:私はこれを持つクラスを編集しました完全に削除されたor条件と私は2つの変数の中で条件とバインドを連結し、それらを内部にラップします。そして、条件はOR条件の合計になります。

+0

私は、編集するのではなくクラスを拡張する方がよいと思います。これは、ライブラリを更新する際の将来の問題を避けるためです。もう一つの**もっと良い解決策**は、プルリクエストを作成してそこに_fix_を適用することです。この方法で、ライブラリの他のユーザーはあなたの_improvements_から利益を得ることができます_ – Timothy

+0

はい私はあなたに同意しますが、これはこのライブラリの開発者がもう更新しません – John

関連する問題