我对CodeIgniter有以下查询:
$q = $this->db->where('(message_from="'.$user_id.'" AND message_to="'.$this->auth_model->userdata['user_id'].'")')
->or_where('(message_from="'.$this->auth_model->userdata['user_id'].'" AND message_to="'.$user_id.'")')
->get('messages');
我想用完全活跃的记录来编写这个查询。
我尝试过这样的事情:
$from_where = array('message_from'=>$user_id, 'message_to'=>$this->auth_model->userdata['user_id']);
$to_where = array('message_from'=>$this->auth_model->userdata['user_id'],'message_to'=>$user_id);
$q = $this->db->where($from_where)
->or_where($to_where)
->get('messages');
die($this->db->last_query());
以上代码生成此查询:
SELECT * FROM (`messages`) WHERE `message_from` = '2' AND `message_to` = '1' OR `message_from` = '1' OR `message_to` = '2'
但这就是我想要制作的东西:
SELECT * FROM (`messages`) WHERE (message_from="2" AND message_to="1") OR (message_from="1" AND message_to="2")
有类似的问题here和here,但是并没有为我提供真正的解决方案。
这怎么可能,如果不是通过核心库,是否有允许编写此类查询的扩展名?
谢谢,
答案 0 :(得分:1)
您可以使用codeigniter的子查询方式为此目的执行此操作,您将不得不破解codeigniter。像这样 转到system / database / DB_active_rec.php从这些函数中删除public或protected关键字
public function _compile_select($select_override = FALSE)
public function _reset_select()
现在子查询写入可用现在这里是带有活动记录的查询
$this->db->where('message_from','2');
$this->db->where('message_to','1');
$subQuery1 = $this->db->_compile_select();
$this->db->_reset_select();
$this->db->where('message_from','1');
$this->db->where('message_to','2');
$subQuery2 = $this->db->_compile_select();
$this->db->_reset_select();
$this->db->select('*');
$this->db->where("$subQuery1");
$this->db->or_where("$subQuery2");
$this->db->get('messages');
看看我的这个答案。这显示了如何使用子查询。这将有助于 Using Mysql WHERE IN clause in codeigniter
EDITES
是的,我已经做到了 完全按照这种方式重写查询
$this->db->where('message_from','2');
$this->db->where('message_to','1');
$subQuery1 = $this->db->_compile_select(TRUE);
$this->db->_reset_select();
$this->db->where('message_from','1');
$this->db->where('message_to','2');
$subQuery2 = $this->db->_compile_select(TRUE);
$this->db->_reset_select();
$this->db->select('*');
$this->db->where("($subQuery1)");
$this->db->or_where("($subQuery2)");
$this->db->get('messages');
编译选择是带有true参数。不会产生select子句。这将产生
SELECT * FROM (`messages`) WHERE (`message_from` = '2' AND `message_to` = '1') OR (`message_from` = '1' AND `message_to` = '2')