2016-07-21 2 views
0

phalcon-datatables 의 어댑터는 datatables입니다.Phalcon datatables 어댑터 조건이 작동하지 않습니다.

나는 예컨대, 내 QueryBuilder의 경우 조건이 있습니다

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 조건과 함께 작동하는 이유라고 생각합니다. 그리고 이것이 글로벌 검색이 작동하지 않는 이유입니다.

라이브러리 내부에서이 문제를 해결할 생각이 있습니까?

편집 :

나는 해결책을 가지고 생각합니다. 나는 그 (것)들에 대괄호를 써야한다.

그러나 어떻게 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() 함수에서 나는이 코드를 추가 : 나는 클래스 내부의 세 멤버를 선언

:이 가지는 클래스를 편집 완전히 제거 된 orWhere 조건과 나는 조건과 바인딩을 2 개의 변수 안에서 연결하고 그 안에 OR를 넣습니다. 그리고 조건은 OR 조건의 합계입니다.

+0

수정하는 것보다는 클래스를 확장하는 것이 더 좋습니다. 이것은 라이브러리를 갱신 할 때의 장래의 문제점을 피하기 위해서입니다. 또 다른 ** 더 나은 솔루션 **은 풀 요청을 작성하고 거기에 _fix_를 적용하는 것입니다. 이 방법으로 라이브러리의 다른 사용자가 _improvements_ 혜택을 누릴 수 있습니다. – Timothy

+0

예 동의합니다. 그러나이 lib 개발자는 더 이상 업데이트하지 않습니다. – John

관련 문제