用于更新行的自定义逻辑

时间:2010-11-04 21:25:56

标签: php zend-framework

我有这个表类:

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不存在?

1 个答案:

答案 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);

因此,如果您要使用次更新一行的自定义逻辑(无论是从表对象还是行对象更新),都应将其放入表对象中。

来自Zend_Db_Table_Row docs

  

如果您需要在特定表中执行自定义逻辑,并且必须对该表上的每个操作执行自定义逻辑,那么在insert(),update()和delete中实现自定义代码可能更有意义( )Table类的方法。但是,有时可能需要在Row类中执行自定义逻辑。