2017-09-27 7 views
0

$ this-> db-> where()と$ this-> db-> query()を混在させているときに奇妙な現象が発生しています。Codeigniter ActiveRecordとthis-> db-> query conflict

if (!empty($args) && is_array($args)) { 
    foreach ($args as $key => $value) { 
     $this->db->where_in($field, $value); 
    } 
} 
$result = $this->db->query('SELECT * FROM ...')->result_array(); 

私はActiveRecordは、通常のクエリを混在させないために、おそらくより良いであることを理解することができますが、私は私が$this->db->where_in()を構築していますWHERE句は(つまり、WHERE句は次のクエリで実行)以降のクエリに影響を及ぼしていることを経験しています。

すべてのクエリをActiveRecordを使用しないか、またはActiveRecordのみを使用するように書き換える必要がありますか?あるいは、この「衝突」を防ぐ手段がありますか?私は$ ths-> db-> flush_cache()について考えましたが、データベースのキャッシュを使用していないので、それを使用しても効果がないようです。

答えて

1

私はループ内でdb->where_inを呼び出さないことをお勧めします。代わりに考える

if (!empty($args) && is_array($args)) 
{ 
    foreach ($args as $key => $value) 
    { 
     $values[] = $value; 
    } 
    $this->db->where_in($field, $values); 
} 

実際には、$ argsが(連想配列とは対照的に)索引付けされた配列である場合、ループは必要ありません。あなたは、単にforeachを削除して、あなたはおそらく、クエリビルダ(以前のActive Recordとして知られている)とdb->query()を混在させることはできません

$this->db->where_in($field, $args); 

を使用することができます。クエリービルダー(QB)メソッドは、基本的にはdb->query()に提供するステートメントをアセンブルし、ほとんどの場合、文字通りquery("The statement that QB built")を呼び出します。

IMOでは、ほとんどの場合、クエリ文を入力して$this->db->query("Select * from ...");で使用する方が簡単です。クエリービルダーは素晴らしいですが、しばしば価値があるより多くの仕事です。

例では、おそらくクエリビルダーに固執する必要があります。それはまだ非常に簡潔なことができます。 1つの表からすべてのフィールドを検索する場合は、db->getがその作業を行います。

$result = $this->db->get('table_name')->result_array(); 

通常、QBは、ステートメントがget、insert、またはupdateの呼び出しで実行されたときにステートメントに入るさまざまな要素をすべてクリアします。この呼び出しでいつでも新しく開始することができます。

$this->db->reset_query();