J'utilise la classe Active Record de CodeIgniter pour interroger la base de données MySQL. Je dois sélectionner les lignes d'une table dans laquelle un champ n'est pas défini sur NULL:
$this->db->where('archived !=', 'NULL');
$q = $this->db->get('projects');
Cela ne renvoie que cette requête:
SELECT * FROM projects WHERE archived != 'NULL';
Le champ archived
est un champ DATE
.
Y a-t-il une meilleure façon de résoudre ce problème? Je sais que je peux juste écrire la requête moi-même, mais je ne veux pas rester avec Active Record dans tout mon code.
where('archived IS NOT NULL', null, false)
Le disque actif a certainement quelques bizarreries. Lorsque vous transmettez un tableau à la fonction $this->db->where()
, il génère un IS NULL. Par exemple:
$this->db->where(array('archived' => NULL));
produit
WHERE `archived` IS NULL
Le problème, c'est qu'il n'y a pas d'équivalent pour le IS NOT NULL
négatif. Cependant, il existe un moyen de le faire qui produit le résultat correct et échappe encore à la déclaration:
$this->db->where('archived IS NOT NULL');
produit
WHERE `archived` IS NOT NULL
Null ne doit pas être défini sur string ...
$this->db->where('archived IS NOT', null);
Cela fonctionne correctement lorsque null n'est pas encapsulé dans des guillemets.
CodeIgniter 3
Seulement:
$this->db->where('archived IS NOT NULL');
La requête générée est:
WHERE archived IS NOT NULL;
$ this-> db-> where ('archivé IS NON NULL', null , false ); << Pas nécessaire
Inverse:
$this->db->where('archived');
La requête générée est:
WHERE archived IS NULL;
Codeigniter génère une requête "IS NULL" en laissant simplement l'appel sans paramètre:
$this->db->where('column');
La requête générée est:
WHERE `column` IS NULL
Vous pouvez faire (si vous voulez tester NULL)
$this->db->where_exec('archived IS NULL)
Si vous voulez tester NOT NULL
$this->db->where_exec('archived IS NOT NULL)
Et pour vous donner encore une autre option, vous pouvez utiliser NOT ISNULL(archived)
comme filtre WHERE.
Il est préférable d’utiliser la suite de For n’est pas nul
où ('archivé IS NOT NULL', null);
Pour est nul
où ('archivé', nul);
$ this-> db-> or_where ('end_date IS', 'NULL', false);