2010-11-04 126 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类中执行自定义逻辑。