我正在使用phalcon-datatables这是datatables的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条件被忽略,然后它会显示我的数据库中搜索条件的所有记录。
当我使用列搜索时效果很好。
我认为这个问题出在本课程中 - > 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%')
答案 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条件。