2012-11-22 70 views
7

我有一張這樣的表。使用CodeIgniter的NULL比較ActiveRecord

[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的?

任何幫助表示讚賞。

+0

希望這將有助於http://codeigniter.com/forums/viewthread/119444/P15 – sbaaaang

+0

你設置允許空DEFAULT NULL mysql的選項,你的數據庫字段? – sbaaaang

+1

有用的論壇主題。 –

回答

11

您可以使用:

$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

+0

非常有用。謝謝。 –

-1

這必須是這樣:

$this->db->from('person')->where('age IS NOT NULL', null); 
+0

我試過了,它不起作用。 ActiveRecord試圖將該字段與NULL進行比較,但是NULL不會與任何東西進行比較,所以它會報告一個sql語法錯誤。 –

+0

嘗試where('age IS NOT NULL',null) – mallix

+0

查看方法簽名'public function where($ key,$ value = NULL,$ escape = TRUE)' - 第二個參數不是強制性的。 – alphacentauri