2017-09-27 1 views
0

Je rencontre un phénomène étrange en mélangeant $ this-> db-> where() et $ this-> db-> query().Codeigniter ActiveRecord et this-> db-> conflit de requête

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

Même si je peux comprendre qu'il est sans doute préférable de ne pas mélanger ActiveRecord et requêtes régulières, je fais l'expérience que la clause WHERE je construis avec $this->db->where_in() affecte les requêtes suivantes (c.-à-la clause exécute sur requête suivante) .

Toutes mes requêtes doivent-elles être réécrites pour ne pas utiliser ActiveRecord ou pour utiliser UNIQUEMENT ActiveRecord? Ou y a-t-il un moyen d'empêcher ce "conflit"? J'ai pensé à $ ths-> db-> flush_cache() mais je n'utilise pas la mise en cache de base de données, et son utilisation ne semble pas avoir d'effet.

Répondre

1

Je suggère de ne pas appeler db->where_in dans une boucle. Considérons à la place

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

En vérité, la boucle n'est pas nécessaire si $ args est un tableau indexé (par opposition à associatif). Vous pouvez simplement supprimer le foreach et utiliser

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

Vous ne devriez probablement pas mélanger Query Builder (anciennement connu sous le nom Active Record) et db->query(). Les méthodes Query Builder (QB) assemblent essentiellement une instruction que vous fournissez à db->query() et puis, littéralement appelle query("The statement that QB built"). IMO, il est presque toujours plus facile de taper l'instruction de requête et de l'utiliser dans $this->db->query("Select * from ...");. Query Builder est génial, mais c'est souvent plus de travail que ça en vaut la peine.

Dans votre exemple, vous devriez probablement vous en tenir à Query Builder. Cela peut encore être très concis. Si vous cherchez tous les champs d'une seule table, alors db->get fera l'affaire.

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

En général QB efface tous les divers éléments créés qui entrent dans la déclaration lorsque l'instruction est exécutée avec un get, insérer, ou un appel de mise à jour. Vous pouvez commencer à tout moment avec cet appel.

$this->db->reset_query();