2016-07-21 52 views
0

我正在使用phalcon-datatables這是一個datatables適配器Phalcon PHPPhalcon數據表適配器,其中條件不起作用

我有一個WHERE條件在我的QueryBuilder,e.g:

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條件的作品。這就是全球搜索無效的原因。

你有什麼想法解決這個問題在庫裏面嗎?

編輯:

我想我有一個解決方案。我必須在orWhere上放上括號。

但我怎麼能做這個查詢與phalcon?

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

你可以用你自己的類MyQueryBuilder擴展QueryBuilder來擴展QueryBuilder。然後用您的自定義修復程序覆蓋'getResponse()'方法。 – Timothy

+0

這不是phalcon官方擴展。只需在此存儲庫上編寫問題並/​​或對其進行PR即可。 – Juri

+0

我沒有修復我需要一些幫助來解決這個問題 – John

回答

1

我解決了我的問題。我可以幫助任何人。我編輯與此類:

我聲明的類內3個成員:

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()函數I加入此代碼:

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

我完全刪除了orWhere條件,並且我將條件和2個變量內的綁定連接起來,並將它們包含在andWhere條件中以使OR條件總和。

+0

我認爲最好是擴展類而不是編輯。這樣可以避免在更新庫時的未來問題。另一個**更好的解決方案**是創建一個pull請求並在那裏應用你的_fix_。這樣,圖書館的其他用戶可以從您的_improvements_ – Timothy

+0

中受益是的,我同意你的看法,但是這個庫的開發者不再更新 – John