在Zend Framework Model中更新单个数据库单元

时间:2010-01-31 12:16:41

标签: zend-framework zend-db

简单的希望是,我应该使用Zend Framework中的模型更新单个数据库值。

我目前这样做:

class Model_MyModel extends Zend_Db_Table_Abstract
{
    $_name = 'table';
    public function updateSetting($id,$status)
    {
        $data = array(
            'status' => $status
        );
        $this->update($data, 'id = '.$id);
    }
}

$update = new Model_MyModel();
$update->updateSetting(10,1);

显然我可以传递另一个参数作为要更新的列。我只是想知道我应该采用更“神奇”的方式吗?

1 个答案:

答案 0 :(得分:1)

你可以为此写一个简单的property overloader

class Model_MyModel extends Zend_Db_Table_Abstract
{
    protected $_name = 'table';

    /**
     * Should be  a Zend_Db_Table_Row instance
     * 
     * @var Zend_Db_Table_Row 
     */
    protected $_currentRow = null;

    /**
     * Property overloader
     * 
     * For more information on this see 
     * http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.members
     * 
     * @param string $key
     * @param string $value
     * @return void
     */
    public function __set($key, $value)
    {
        $row = $this->getCurrentRow();
        if (null !== $row)
        {
            $row->$key = $value;
        }
        else
        {
            throw new Exception('Cannot update a column on a non existent row!');
        } 
    }

    /** 
     * Save current row
     * 
     * @return Model_MyModel
     */
    public function saveCurrentRow()
    {
        $row = $this->getCurrentRow();
        if (null !== $row)
        {
            $row->save();
        }
        else
        {
            throw new Exception('Cannot save a non existent row!');
        } 
    }

    /**
     * Set current row
     * 
     * @param Zend_Db_Table_Row $row
     * @return Model_MyModel
     */
    public function setCurrentRow(Zend_Db_Table_Row $row)
    {
        $this->_currentRow = $row;
        return $this;
    }

    /**
     * Get current row
     *
     * @return Zend_Db_Table_Row
     */
    public function getCurrentRow()
    {
        return $this->_currentRow;
    }
}

然后你可以做这样的事情:

$model = new Model_MyModel();
$model->status = 'foo';
$model->somecolumn = 'bar'
$model->saveCurrentRow();

虽然这种方法需要对代码进行最少的编辑,但更好的方法是从数据库表中分离模型,并使用Data Mapper Pattern中描述的Quickstart