2012-10-18 60 views
0

我對下面的代碼有些困惑,它簡單地檢查表中是否存在列,然後將其添加到帶有addField()的模型中。Model類中的公共var的未定義屬性?

奇怪然而,PHP error_log中警告我說,公共變量定義不正確,我第一次使用它:

/var/www/ocmal_db_svn/lib/Model/Conflicto.php:[Notice] Undefined property: Model_Conflicto::$entity_code, 

這就是爲什麼SQL查詢拋出一個錯誤,因爲「SHOW列FROM」是不完整沒有表名...

在類中定義一個公共變量應該初始化它,不是嗎? 還是別的什麼問題?任何人都可以在這裏看到錯誤? 我忽略了什麼? (這是PHP 5.3 BTW)

class Model_Conflicto extends Model_Table { 

     public $entity_code='conflicto'; 

     function init(){ 
      parent::init(); 

       if ($this->api->db->dsql()->expr("SHOW COLUMNS FROM `". $this->entity_code. "` LIKE 'lock_id'")->getOne()==null) 
      error_log('OCMAL_DB: WARNING: table '.$this->entity_code.' does not have lock_id, which is kinda BAD !!!'); 
     else $this->addField('lock_id'); 

回答

0

這絕對不是一個完整的回答你的問題,因爲我真的不明白這一點,但:

1)你應該使用公共$表='conflicto'而不是$ entity_code,因爲$ entity_code已經過時(但仍然可用於兼容性原因)

2)我沒有看到任何理由爲什麼你需要檢查表中是否存在表中之前,將其添加到模型。有沒有可能在沒有通知的情況下從數據庫中刪除字段,並且不要將其從模型中刪除?如果是這樣的話,那麼你需要改變你的項目管理中的某些東西,而不是創建混亂和veeeeeery慢代碼:) 您是否想象如果您將查詢顯示此模型的每個初始化將有多大的壓力會產生到您的數據庫列從表?!

+0

感謝您的意見。顯然這不是生產,並且error_log出於測試和兼容性原因。我會用你所建議的表格替換entity_code,看看它有什麼作用。 – gsteenss

+0

是的:我現在看到,在Model_Table中:'function __construct(){if {this-> entity_code} {$ this-> table = $ this-> entity_code; 未設置($ this-> entity_code); } }' – gsteenss