我尝试使用codeigniter的活动记录执行以下SQL查询:
SELECT * FROM USERS_OPTIONS WHERE user_id = 3 AND ( option_id = 2 OR option_id = 5 OR option_id = 108 OR .... )
为此,我在codeigniter中有这个代码,但是它没有工作:
$this -> db -> where("user_id", $user_id);
foreach( $options as $option ){
$this -> db -> or_where("option_id" , $option["id"] );
}
$ options是一个数组,我存储了我需要的所有options_id。
如果我分别尝试2个查询中的任何一个,它们都能正常工作。但是我无法混合这两个条件。
我怎么能得到这个?提前谢谢。
答案 0 :(得分:3)
您可以使用$this->db->where_in()
:
生成WHERE字段IN('item','item')与AND连接的SQL查询 如果合适的话
$names = array('Frank', 'Todd', 'James');
$this->db->where_in('username', $names);
// Produces: AND username IN ('Frank', 'Todd', 'James')
在您的情况下,您将拥有:
$this->db->where_in('option_id', $options)
->get_where("your_table", array("user_id" => $user_id))->result();
Doc:https://ellislab.com/codeigniter/user-guide/database/active_record.html
答案 1 :(得分:1)
$this->db->select()->from('USERS_OPTIONS')->where("user_id $user_id AND (
// LOOP THROUGH PHP TO PRINT SOME THING LIKE or_where
));
答案 2 :(得分:0)
您应该尝试$this->db->where_in();
。首先收集所有选项ID&然后像这样使用它:
生成WHERE字段IN(' item',' item')SQL查询与AND连接(如果适用)
$names = array('Frank', 'Todd', 'James');
$this->db->where_in('username', $names);
// Produces: AND username IN ('Frank', 'Todd', 'James')
答案 3 :(得分:0)
请检查以下代码,并且不能使用活动记录方法连接AND OR条件。
//Filtering by user
$where_condition = "(user_id = '".$user_id."')";
//Filtering by options
if(count($options)){
$where_condition .= " AND (";
foreach( $options as $option ){
$where_condition .= "option_id = '".$option["id"]."' OR ";
}
$where_condition = substr($where_condition, 0, -3); //Remove last 3 characters OR with space
$where_condition = $where_condition. ")";
}
//Select data
$this->db->select('*');
$this->db->from("TABLE_NAME");
$this->db->where($where_condition);
答案 4 :(得分:0)
最后,这是我使用活动记录实现此目的的最佳方式:
使用如下数组:
$options = array ( option_id1 , option_id2, ... , option_idn );
$this -> db -> where("id_user", $id_user);
$this -> db -> where_in("id_option" , $options );
这给了我我想要的东西,它非常清楚