reb*_*ion 72 mysql null activerecord codeigniter
我正在使用CodeIgniter的Active Record类来查询MySQL数据库.我需要在表中选择一个字段未设置为NULL的行:
$this->db->where('archived !=', 'NULL');
$q = $this->db->get('projects');
Run Code Online (Sandbox Code Playgroud)
这只返回此查询:
SELECT * FROM projects WHERE archived != 'NULL';
Run Code Online (Sandbox Code Playgroud)
该archived字段是一个DATE字段.
有没有更好的方法来解决这个问题?我知道我可以自己编写查询,但我不想在整个代码中坚持使用Active Record.
zer*_*kms 138
where('archived IS NOT NULL', null, false)
Run Code Online (Sandbox Code Playgroud)
J.M*_*ney 60
Active Record肯定有一些怪癖.将数组传递给$this->db->where()函数时,它将生成一个IS NULL.例如:
$this->db->where(array('archived' => NULL));
Run Code Online (Sandbox Code Playgroud)
产生
WHERE `archived` IS NULL
Run Code Online (Sandbox Code Playgroud)
怪癖是负面的没有等价物IS NOT NULL.但是,有一种方法可以产生正确的结果并且仍然可以逃避声明:
$this->db->where('archived IS NOT NULL');
Run Code Online (Sandbox Code Playgroud)
产生
WHERE `archived` IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
小智 7
Null不能设置为字符串...
$this->db->where('archived IS NOT', null);
Run Code Online (Sandbox Code Playgroud)
当null未包含在引号中时,它可以正常工作.
CodeIgniter 3
只要:
$this->db->where('archived IS NOT NULL');
Run Code Online (Sandbox Code Playgroud)
生成的查询是:
WHERE archived IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)
$ this-> db-> where('archived IS NOT NULL',null,false); <<没必要
逆:
$this->db->where('archived');
Run Code Online (Sandbox Code Playgroud)
生成的查询是:
WHERE archived IS NULL;
Run Code Online (Sandbox Code Playgroud)
使用以下内容会更好:
对于不为空:
where('archived IS NOT NULL', null);
Run Code Online (Sandbox Code Playgroud)
对于空:
where('archived', null);
Run Code Online (Sandbox Code Playgroud)
更新
当检查 NULL 或 IS NOT NULL 时,我们可以在不需要 CodeIgniter 的 Active Record 的地方使用第二个参数。这是正确的用法:
对于 IS NOT NULL:
$this->db->where('archived IS NOT NULL');
$q = $this->db->get('projects');
Run Code Online (Sandbox Code Playgroud)
对于 IS NULL:
$this->db->where('archived IS NULL');
$q = $this->db->get('projects');
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,您都不需要提供第二个参数。where 方法自动正确处理 NULL 比较,无需显式第二个参数。