Phalcon数据表适配器,其中条件不起作用

时间:2016-07-21 10:28:24

标签: php datatables phalcon

我正在使用phalcon-datatables这是datatablesPhalcon PHP适配器。

我的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}%"]);
    });

列搜索使用andWhere。

$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%')

1 个答案:

答案 0 :(得分: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()函数中,我添加了以下代码:

$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条件。