[英]Where clause based multiple dynamic values, CodeIgniter
下拉框是根據已分配給用戶的客戶動態填充的。 問題是,當我要搜索分配給該用戶的客戶時(如果他們選擇查看All
客戶的選項),則必須執行以下查詢:
查詢1:
SELECT * FROM LotDispDashBoardDB.disp_dummy where (customer = 'DL1' or customer = 'BC1') and stage like 'T%' and lot_status like 'close%';
我不想做
查詢2:
SELECT * FROM LotDispDashBoardDB.disp_dummy where stage like 'T%' and lot_status like 'close%';
因為我希望用戶只能看到他們自己分配的客戶,所以我不希望他們看到所有可用客戶。
下拉框只有一個固定值All
,其余為各個客戶名稱。 如果用戶選擇“ All
表示他要查看其All
分配客戶。 在下面的控制器中,如果他選擇全部,我將獲得$all_customer
數組。 如果沒有,我只會選擇客戶。
在模型中知道是否全部,我檢測接收到的值是否為數組。 如果是數組,我遍歷它,使用CodeIgniter的活動記錄$this->db->or_where('customer', $customer);
進行查詢。 主要問題是查詢。 如前所述,我嘗試使用查詢1。 如何放置方括號並動態編寫where
子句?
控制器:
public function load_lot_table()
{
// Get customers from session
$customer_session = $this->session->userdata['logged_in']['customers'];
foreach($customer_session as $cust_object)
{
$all_customer[] = $cust_object->customer;
}
// Get form values
if($this->input->get())
{
$selected_customer = $this->input->get('cust_drop_down');
$stage = $this->input->get('area_drop_down');
$lot_status = $this->input->get('status_drop_down');
$search_lot = ltrim( $this->input->get('search_lot') );
if($selected_customer == 'all')
{
$customer = $all_customer;
}
else
{
$customer = $selected_customer;
}
}
else
{
// Default values when page is loaded because form is not submitted yet
$customer = $all_customer;
$stage = 'all';
$lot_status = 'all';
$search_lot = '';
}
// Keys are the column names
$search = array(
'customer' => $customer,
'stage' => $stage,
'lot_status' => $lot_status,
'search_lot' => $search_lot
);
// Paginate retrieved lots
$results = $this->paginate_create_table($search);
/*** other codes ***/
}
private function paginate_create_table($search = null)
{
if( is_array( $search['customer'] ) )
{
$customer = 'all';
}
else
{
$customer = $search['customer'];
}
// Set pagination configuration
$config = array();
$config['base_url'] = base_url()."index.php/Home/on_hold_lot";
$config['suffix'] = '?cust_drop_down='.$customer.'&area_drop_down='.$search['stage'].'&status_drop_down='.$search['lot_status'].'&search_lot='.$search['search_lot'];
$config['first_url'] = $config['base_url'].$config['suffix'];
$config['total_rows'] = $this->home_model->fetch_lots('rows', $search);
$config['per_page'] = 10;
$config['uri_segment'] = 3;
/*** Other codes ****/
}
模型:
public function fetch_lots($return, $search = null, $limit = null, $start = 0)
{
if($limit != null)
{
$this->db->limit($limit, $start);
}
if($search != null)
{
if( $search['customer'] != 'all' && !is_array( $search['customer'] ) )
{
$this->db->where('customer', $search['customer']);
}
elseif( is_array( $search['customer'] ) )
{
foreach($search['customer'] as $customer)
{
$this->db->or_where('customer', $customer);
}
}
if($search['stage'] != 'all')
{
$this->db->like('stage', $search['stage'], 'after');
}
if($search['lot_status'] != 'all')
{
$this->db->like('lot_status', $search['lot_status'], 'after');
}
if($search['search_lot'] != '')
{
$this->db->where('utac_lot', $search['search_lot']);
}
}
/*** Other codes ***/
}
Codeigniter允許您將字符串傳遞給$this->db->where()
例:
$where = "(this = $that)";
$this->db->where($where);
當您遍歷$search['customer']
,可以構建一個字符串用作您的where
查詢。
if( $search['customer'] != 'all' && !is_array( $search['customer'] ) )
{
$this->db->where('customer', $search['customer']);
}
elseif( is_array( $search['customer'] ) )
{
for($i = 0, $i <= count($search['customer'], $i++)
{
// Use a FOR instead of FOREACH so we can count the loops.
// 'WHERE' will be used on the first loop,
// subsequent loops use 'OR'.
if($i == 0)
{
$where = "( WHERE customer = $search['customer'][$i] ";
} else {
$where .= " OR customer` = $search['customer'][$i] ";
}
if($i == count($search['customer']))
{
$where .= " ) ";
}
}
$this->db->where($where);
}
//... etc..
}
這就是我想出的解決方案。
// If user selects a customer
if( $search['customer'] != 'all' && !is_array( $search['customer'] ) )
{
$this->db->where('customer', $search['customer']);
}
// If user selects ALL
elseif( is_array( $search['customer'] ) )
{
foreach($search['customer'] as $customer)
{
$all_customer[] = "customer = '$customer'";
}
// Example query would form: (customer = 'ABC' OR customer = 'BCD')
$where_customer = "(";
$where_customer .= implode(' OR ', $all_customer);
$where_customer .= ")";
$this->db->where($where_customer);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.