Как обновить данные в базе данных - PullRequest
0 голосов
/ 06 декабря 2010

Для сохранения данных в базе данных рассмотрим следующий код в datamapper:

 /**
 * Save data into the database
 * @param Site_Model_User $model
 * @throws InvalidArgumentException
 */
public function save($model) {
    if (!$model instanceof Model_User) {
        throw new InvalidArgumentException('Model is not of correct type');
    }
    $data = array();
    $data['username'] = $model->getUserName();
    $data['firstname'] = $model->getFirstName();
    $data['lastname'] = $model->getLastName();
    $data['email'] = $model->getEmail();
    $data['password'] = $model->getPassword();
    $data['role'] = $model->getRole();
    $data['pic'] = $model->getImage();
    if ($model->getId() < 0) {
        // nieuw object, doe insert
        $id = $this->getDao()->insert($data);
        $model->setId($id);

    } else {
        // bestaand object, doe update
        $where = $this->getDao()->getAdapter()->quoteInto('id = ?', $model->getId());
        $this->getDao()->update($data, $where);
    }
}

Что я делаю, так это то, что я сохраняю свой объект каждый раз.При выполнении вставки это не проблема.Потому что я отправляю полное заполненное обновление.Но допустим, я хочу обновить свой пароль.И я делаю обновление.Он не позволяет мне выполнить обновление, потому что он говорит, что определенные значения не могут быть 0.

Например: Ошибка выполнения оператора Mysqli: столбец «username» не может быть нулевым »лучшее решение для этого? Должен ли я сначала снова загрузить весь объект из базы данных, затем изменить поля и затем выполнить обновление? Или есть другие лучшие, более распространенные решения?

Спасибо

Ответы [ 2 ]

0 голосов
/ 06 декабря 2010

Ответы Чандреса Махешвари - верный вариант, но рассмотрите это как альтернативу.

Я не знаком с используемой вами платформой, но вы не можете самостоятельно построить запрос или хотя бы выбрать поля, которые хотите обновить?

Я бы сделал что-то вроде:

public function save($model) {
    if (!$model instanceof Model_User) {
        throw new InvalidArgumentException('Model is not of correct type');
    }
    $data = array();
    if($model->getUserName())
        $data['username'] = $model->getUserName();
    if($model->getFirstName())
        $data['firstname'] = $model->getFirstName();

    // .... and so on ...

    if ($model->getId() < 0) {
        // nieuw object, doe insert
        $id = $this->getDao()->insert($data);
        $model->setId($id);

    } else {
        // bestaand object, doe update
        $where = $this->getDao()->getAdapter()->quoteInto('id = ?', $model->getId());
        $this->getDao()->update($data, $where);
    }
}

Конечно, вы должны проверить, является ли поле ложным / NULL, потому что оно не было изменено или потому что пользователь действительно хочет, чтобы оно было пустым (т.е. удалено), или убедитесь, что все поля не равны NULL, когда вы вставляете.

0 голосов
/ 06 декабря 2010

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

Спасибо.

...