2010-11-04 77 views
1

我有這樣的表類:自定義邏輯更新一行

class Songs extends Zend_Db_Table_Abstract 
{ 
    protected $_name = 'songs'; 
    protected $_primary = 'song_id'; 
    protected $_rowClass = 'Song'; 
} 

和延伸上面一些自定義的邏輯類的類。

class Song extends Zend_Db_Table_Row_Abstract 
{ 
    protected function _insert() 
    { 
     print_r($this); 
     // $this does exist 
    } 

    protected function _update() 
    { 
     print_r($this); 
     //$this does not existing when updating a row, why not? 
    } 
} 

我的問題是,當我插入新行我可以在我的自定義邏輯使用$此。

$row->save(); // $this exists in _insert() 

但是,當我試圖更新一行時,它不存在。

$myRow->update($data, $where); // $this does not exists in _update() 

爲什麼$當我想更新行之前做一些自定義邏輯這不存在?

+1

我猜測,而不是'print_r($(this));'你的意思是'print_r($ this)'? – 2010-11-04 21:58:48

回答

3

更新一行,您不使用:

$myRow->update($data, $where); 

您使用:

$myRow->save(); 

但試圖用update()行對象上應拋出異常。

所以我猜你實際上是調用表對象update()功能,而不是行對象

$songs = new Songs(); 
//... 
$songs->update($data, $where); 

在該點,排對象甚至從未使用的,簡單地從$data陣列和$where子句生成的查詢。

如果你想使用自定義_update()方法,你需要做的是這樣的:

$songs = new Songs(); 
$song = $songs->find($id) 
//change some data 
$song->save(); 

當然也是完全有效的在表級別添加自定義邏輯,並同時調用一個應該注意的更新或插入表格對象不使用行對象,調用save()對行對象代理表對象

例如,從Zend_Db_Table_Row_doInsert()功能:

$this->_insert(); 
//... 
$primaryKey = $this->_getTable()->insert($data); 

所以,如果你有,你要使用一次更新行(不管你從表對象或行更新定製邏輯對象),它應該放入表格對象中。

Zend_Db_Table_Row docs

如果你需要做的自定義邏輯在一個特定的表,和定製邏輯必須發生在該表中的每個操作,可能更有意義,實現您的自定義代碼Table類的insert(),update()和delete()方法。但是,有時可能需要在Row類中執行自定義邏輯。