Обновление отдельной ячейки базы данных в Zend Framework Model - PullRequest
1 голос
/ 31 января 2010

Надеюсь, это просто, есть ли какой-то особый способ обновления одного значения базы данных с использованием модели в 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 Ответ

1 голос
/ 31 января 2010

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

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

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

...