使用 CodeIgniter ActiveRecord 进行 NULL 比较 [重复]
Posted
技术标签:
【中文标题】使用 CodeIgniter ActiveRecord 进行 NULL 比较 [重复]【英文标题】:NULL compare using CodeIgniter ActiveRecord [duplicate] 【发布时间】:2012-11-11 02:29:20 【问题描述】:我有一张这样的桌子。
[id] [name] [age]
1 foo 20
2 bar NULL
如果我需要在年龄字段为 NULL 时返回所有行,我执行以下操作,它工作正常。
$this->db->from('person')->where('age', null);
问题是我需要做相反的事情,我的意思是,当年龄字段不是空值时返回所有行。 在 SQL 中我做这样的事情
SELECT * FROM person WHERE age is not null
我如何使用 CodeIgniter ActiveRecord 做到这一点??
任何帮助表示赞赏。
【问题讨论】:
希望这会有所帮助codeigniter.com/forums/viewthread/119444/P15 您是否将 ALLOW NULL DEFAULT NULL mysql 选项设置为您的数据库字段? 这是在 where 命令中进行多重比较的方式 $where = array('somebit' => '1', 'status' => 'Published', 'sc_id' => TRUE ); $this->db->where($where); @sbaaaang 引用的线程现在位于ellislab.com/forums/viewthread/119444/P15 【参考方案1】:你可以使用:
$this->db->from('person')->where('age is not null');
如果你好奇这是怎么发生的,请看system/database/DB_active_rec.php
protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL)
...
if (is_null($v) && ! $this->_has_operator($k))
// value appears not to have been set, assign the test to IS NULL
$k .= ' IS NULL';
...
还有system/database/DB_driver.php
/**
* Tests whether the string has an SQL operator
*
* @access private
* @param string
* @return bool
*/
function _has_operator($str)
$str = trim($str);
if ( ! preg_match("/(\s|<|>|!|=|is null|is not null)/i", $str))
return FALSE;
return TRUE;
因此,您可以只将第一个参数传递给where()
方法,如果此方法的第一个运算符有一个子字符串is not null
,它将保持不变。
阅读更多 - CodeIgniter forum
【讨论】:
【参考方案2】:一定是这样的:
$this->db->from('person')->where('age IS NOT NULL', null);
【讨论】:
我尝试过,但它不起作用。 ActiveRecord 尝试将该字段与 NULL 进行比较,但 NULL 不比较等于任何值,因此,它会报告 sql 语法错误。 试试 where('age IS NOT NULL', null) 查看方法签名public function where($key, $value = NULL, $escape = TRUE)
- 第二个参数不是必须的。
是的@mallix 可以正常工作,但就像 alphacentauri 所说,在这种情况下不需要 null。以上是关于使用 CodeIgniter ActiveRecord 进行 NULL 比较 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
在非 Codeigniter 类中加载和使用 Codeigniter 模型
使用 Rails 6 ActiveRecord 进行完全外连接