2

私は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")

ここここに同様の質問がありますが、それらは私にとって本当の解決策を提供しませんでした。

コアライブラリを介さない場合、これはどのように可能ですか?そのようなクエリを作成できる拡張機能はありますか?

ありがとう、

4

1 に答える 1

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');

私のこの答えを見てください。これは、サブクエリの使用方法を示しています。これは
、codeigniterでMysqlWHEREIN句を使用するのに役立ちます

編集

はい私はそれをしましたあなたが望むようにこのようにクエリを書き直してください

$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')
于 2012-06-25T09:41:14.617 に答える