条件不工作的 Phalcon 数据表适配器

Phalcon datatables adapter where condition not working

我正在使用 phalcon-datatables this is a datatables adapter for Phalcon 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 条件然后它将显示我数据库中的所有记录以及搜索条件。

当我使用列搜索时,它运行良好。

我认为问题出在 class -> 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%')

我解决了我的问题。我这可以帮助任何人。我用这个编辑了 class :

我在class里面声明了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 条件的总和。