[英]Grocery_CRUD where clause does not work together with filters
在我修復了錯誤的項目中,使用了雜貨店的CRUD()插件。 該文檔提供了一個使用where子句的示例,如下所示:
$crud = new grocery_CRUD();
$crud->set_language($this->config->item('language'));
$crud->set_table('users_products');
$crud->where('users_products.users_id !=', 1);
該表不包含不符合條件的記錄。 看起來一切正常。 不幸的是,當用戶使用置於插件下方的過濾器時,不符合條件的記錄也將包含在搜索結果中。
我究竟做錯了什么? 如何添加搜索詞?
好的,我找到了解決問題的辦法。 也許它不是完美的,可能需要進行一些重構,但是我認為每個人都會理解此解決方案的原理:
在/application/models/Grocery_crud_model.php中,我們必須添加兩個功能:
function group_start()
{
$this->db->group_start();
}
function group_end()
{
$this->db->group_end();
}
在/application/libraries/Grocery_CRUD.php中,我們添加:
public function whereFix($key, $value = NULL, $escape = TRUE)
{
$this->whereFix[] = array($key,$value,$escape);
return $this;
}
在同一文件中,我們添加循環以通過group_start()和group_end()創建條件修復條件並關閉其他類型的術語。 實際上,我們可以替換函數get_list()和get_total_results():
protected function get_list()
{
if(!empty($this->whereFix))
foreach($this->whereFix as $where)
$this->basic_model->where($where[0],$where[1],$where[2]);
if(!empty($this->order_by))
$this->basic_model->order_by($this->order_by[0],$this->order_by[1]);
if(!empty($this->where)){
$this->basic_model->group_start();
foreach($this->where as $where)
$this->basic_model->where($where[0],$where[1],$where[2]);
$this->basic_model->group_end();
}
if(!empty($this->or_where)){
$this->basic_model->group_start();
foreach($this->or_where as $or_where)
$this->basic_model->or_where($or_where[0],$or_where[1],$or_where[2]);
$this->basic_model->group_end();
}
if(!empty($this->like)){
$this->basic_model->group_start();
foreach($this->like as $like)
$this->basic_model->like($like[0],$like[1],$like[2]);
$this->basic_model->group_end();
}
if(!empty($this->or_like)){
$this->basic_model->group_start();
foreach($this->or_like as $or_like)
$this->basic_model->or_like($or_like[0],$or_like[1],$or_like[2]);
$this->basic_model->group_end();
}
if(!empty($this->having))
foreach($this->having as $having)
$this->basic_model->having($having[0],$having[1],$having[2]);
if(!empty($this->or_having))
foreach($this->or_having as $or_having)
$this->basic_model->or_having($or_having[0],$or_having[1],$or_having[2]);
if(!empty($this->relation))
foreach($this->relation as $relation)
$this->basic_model->join_relation($relation[0],$relation[1],$relation[2]);
if(!empty($this->relation_n_n))
{
$columns = $this->get_columns();
foreach($columns as $column)
{
//Use the relation_n_n ONLY if the column is called . The set_relation_n_n are slow and it will make the table slower without any reason as we don't need those queries.
if(isset($this->relation_n_n[$column->field_name]))
{
$this->basic_model->set_relation_n_n_field($this->relation_n_n[$column->field_name]);
}
}
}
if($this->theme_config['crud_paging'] === true)
{
if($this->limit === null)
{
$default_per_page = $this->config->default_per_page;
if(is_numeric($default_per_page) && $default_per_page >1)
{
$this->basic_model->limit($default_per_page);
}
else
{
$this->basic_model->limit(10);
}
}
else
{
$this->basic_model->limit($this->limit[0],$this->limit[1]);
}
}
$results = $this->basic_model->get_list();
return $results;
}
protected function get_total_results()
{
if(!empty($this->whereFix))
foreach($this->whereFix as $where)
$this->basic_model->where($where[0],$where[1],$where[2]);
if(!empty($this->where)){
$this->basic_model->group_start();
foreach($this->where as $where)
$this->basic_model->where($where[0],$where[1],$where[2]);
$this->basic_model->group_end();
}
if(!empty($this->or_where)){
$this->basic_model->group_start();
foreach($this->or_where as $or_where)
$this->basic_model->or_where($or_where[0],$or_where[1],$or_where[2]);
$this->basic_model->group_end();
}
if(!empty($this->like)){
$this->basic_model->group_start();
foreach($this->like as $like)
$this->basic_model->like($like[0],$like[1],$like[2]);
$this->basic_model->group_end();
}
if(!empty($this->or_like)){
$this->basic_model->group_start();
foreach($this->or_like as $or_like)
$this->basic_model->or_like($or_like[0],$or_like[1],$or_like[2]);
$this->basic_model->group_end();
}
if(!empty($this->having))
foreach($this->having as $having)
$this->basic_model->having($having[0],$having[1],$having[2]);
if(!empty($this->or_having))
foreach($this->or_having as $or_having)
$this->basic_model->or_having($or_having[0],$or_having[1],$or_having[2]);
if(!empty($this->relation))
foreach($this->relation as $relation)
$this->basic_model->join_relation($relation[0],$relation[1],$relation[2]);
if(!empty($this->relation_n_n))
{
$columns = $this->get_columns();
foreach($columns as $column)
{
//Use the relation_n_n ONLY if the column is called . The set_relation_n_n are slow and it will make the table slower without any reason as we don't need those queries.
if(isset($this->relation_n_n[$column->field_name]))
{
$this->basic_model->set_relation_n_n_field($this->relation_n_n[$column->field_name]);
}
}
}
return $this->basic_model->get_total_results();
}
我希望這段代碼對某人有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.