Обновление одной ячейки базы данных в Zend Framework Model

Простой, надеюсь, есть ли особый способ, которым я должен обновлять одно значение базы данных, используя модель в 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);

Очевидно, я мог бы передать другой аргумент в качестве столбца для обновления. Мне просто интересно, есть ли более «волшебный» способ, которым я должен это делать?


person robjmills    schedule 31.01.2010    source источник


Ответы (1)


Вы можете написать простой перегрузчик свойств для этого:

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();

Хотя этот подход потребует минимального редактирования вашего кода, еще лучше было бы отделить ваши модели от таблиц вашей базы данных и использовать Шаблон сопоставления данных, как описано в Быстрый старт.

person Aron Rotteveel    schedule 31.01.2010