Wie wähle ich mit ActiveRecord von CodeIgniter Zeilen aus, in denen der Spaltenwert NICHT NULL ist?

73

Ich verwende die Active Record-Klasse von CodeIgniter, um die MySQL-Datenbank abzufragen. Ich muss die Zeilen in einer Tabelle auswählen, in der ein Feld nicht auf NULL gesetzt ist:

$this->db->where('archived !=', 'NULL');
$q = $this->db->get('projects');

Das gibt nur diese Abfrage zurück:

SELECT * FROM projects WHERE archived != 'NULL';

Das archivedFeld ist ein DATEFeld.

Gibt es einen besseren Weg, um dies zu lösen? Ich weiß, dass ich die Abfrage einfach selbst schreiben kann, aber ich möchte im gesamten Code beim aktiven Datensatz bleiben.

Rebellion
quelle

Antworten:

147
where('archived IS NOT NULL', null, false)
zerkms
quelle
14
Beachten Sie, dass CodeIgniter nicht versucht, Ihre Feld- oder Tabellennamen mit Backticks zu schützen, wenn Sie diesen dritten Parameter auf FALSE setzen.
Ben Rogmans
11
Erwähnenswert ist auch, dass Sie dies verwenden können, wenn Sie einen Array-Parameter übergeben : where(array("foo" => "bar", "archived IS NOT NULL" => null)). Ziemlich unintuitiv, funktioniert aber.
Andrey
64

Der Active Record hat definitiv einige Macken. Wenn Sie ein Array an die $this->db->where()Funktion übergeben, wird IS NULL generiert. Zum Beispiel:

$this->db->where(array('archived' => NULL));

produziert

WHERE `archived` IS NULL 

Die Eigenart ist, dass es kein Äquivalent für das Negative gibt IS NOT NULL. Es gibt jedoch eine Möglichkeit, das richtige Ergebnis zu erzielen und sich dennoch der Aussage zu entziehen:

$this->db->where('archived IS NOT NULL');

produziert

WHERE `archived` IS NOT NULL
Keiner
quelle
13
+1, da where('archived IS NOT NULL')dies immer noch Identifikatoren schützt und akzeptierte Antworten nicht.
Thomas Daugaard
7

Null darf nicht auf string gesetzt werden ...

$this->db->where('archived IS NOT', null);

Es funktioniert ordnungsgemäß, wenn null nicht in Anführungszeichen eingeschlossen ist.

Come2Daddy
quelle
3
@GusDeCooL Ich bin mir nicht sicher, ob dies tatsächlich funktioniert. Verwenden dieser Ausgabe ... "Feld IST NICHT" ohne NULL. Die akzeptierte Antwort scheint der richtige Weg zu sein. ellislab.com/forums/viewthread/119444/#593454 - gibt mehr Informationen, die ich jemals könnte.
Andyface
7
-1 weil es nicht funktioniert! Ich habe eine ähnliche Variante versucht: $ this-> db-> where ('when_removed is', null); gab einen Datenbankfehler und zeigte die generierte Abfrage enthalten: ... WHERE "when_removed" ist ORDER BY "last_name" asc ...
Sehr unregelmäßig
7

CodeIgniter 3

Nur:

$this->db->where('archived IS NOT NULL');

Die generierte Abfrage lautet:

WHERE archived IS NOT NULL;

$ this-> db-> where ('archiviert ist NICHT NULL', null , false ); << Nicht notwendig

Umgekehrt:

$this->db->where('archived');

Die generierte Abfrage lautet:

WHERE archived IS NULL;
Rodrigo Prazim
quelle
1

Viel besser zu verwenden:

Denn ist nicht null:

where('archived IS NOT NULL', null);

Denn ist null:

where('archived', null);
Raza Rafaideen
quelle
0

Und um Ihnen noch eine weitere Option zu bieten, können Sie sie NOT ISNULL(archived)als WHERE-Filter verwenden.

Dave Strickler
quelle
0

Codeigniter generiert eine "IS NULL" -Abfrage, indem der Aufruf ohne Parameter verlassen wird:

$this->db->where('column');

Die generierte Abfrage lautet:

WHERE `column` IS NULL
Lirio Push
quelle
OP sucht IS NOT NULLnichtIS NULL
AndFisher
Dies ist die richtige Antwort auf eine andere Frage.
Mickmackusa
0

$ this-> db-> or_where ('end_date IS', 'NULL', false);

Schmied
quelle
0

Sie können dies tun (wenn Sie NULL testen möchten)

$this->db->where_exec('archived IS NULL) 

Wenn Sie NICHT NULL testen möchten

$this->db->where_exec('archived IS NOT NULL) 
Pavan K.
quelle
Wo finden Sie diese where_exec()Methode? Ich sehe es nirgendwo in meinem CI-Projekt und kann online keine einzige Ressource finden, die von ihrem Namen spricht. Bitte unterstützen Sie diese Antwort mit einem Link zur Dokumentation.
Mickmackusa
-2

Eine Möglichkeit, eine der Spalten zu überprüfen, ist null oder nicht

$this->db->where('archived => TRUE);
$q = $this->db->get('projects');

Wenn die Spalte in PHP Daten enthält, kann sie als True dargestellt werden, andernfalls als False

Hier ist das vollständige Beispiel, wie ich Filterspalten in der where-Klausel (Codeignitor) bin. Die letzte zeigt Not NULL Compression

$where = array('somebit' => '1', 'status' => 'Published', 'archived ' => TRUE );
$this->db->where($where);
Amir Qayyum Khan
quelle
Ich habe es gerade versucht und das erzeugte SQL ausgegeben : SELECT * FROM (`test`) WHERE `somebit` = '1' AND `status` = 'Published' AND `sc_id` = 1. Die Überprüfung, ob eine Spalte gleich 1 ist und ob eine Spalte nicht null ist, ist sehr unterschiedlich.
Keine