我有这个表类:
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?
}
}
我的问题是,当我插入一个新行时,我可以在我的自定义逻辑中使用$ this。
$row->save(); // $this exists in _insert()
但是当我尝试更新一行时它不存在。
$myRow->update($data, $where); // $this does not exists in _update()
当我想在更新行之前做一些自定义逻辑时,为什么$ this不存在?
答案 0 :(得分: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()
row对象代表表对象。
例如,来自Zend_Db_Table_Row
_doInsert()
函数:
$this->_insert();
//...
$primaryKey = $this->_getTable()->insert($data);
因此,如果您要使用每次更新一行的自定义逻辑(无论是从表对象还是行对象更新),都应将其放入表对象中。
如果您需要在特定表中执行自定义逻辑,并且必须对该表上的每个操作执行自定义逻辑,那么在insert(),update()和delete中实现自定义代码可能更有意义( )Table类的方法。但是,有时可能需要在Row类中执行自定义逻辑。