条件不工作的 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 条件的总和。
我正在使用 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 条件的总和。