在数据映射器中考虑以下代码,以将数据保存到数据库中:
/**
* 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'不能为null“
对此最好的灵魂是什么? 我应该先从数据库中再次加载整个对象,然后更改字段然后进行更新吗?或者是其他更好,更常见的解决方案?
由于
答案 0 :(得分:0)
是的,您必须加载数据库中的所有字段并填写除密码字段以外的所有必填表单字段,然后更改密码并提交表单。这将帮助您验证必填字段而不是NULL并进一步。
感谢。
答案 1 :(得分:0)
Chandres maheshwari的回答是一个有效的选择,但请考虑将其作为替代选择。
我不熟悉您正在使用的框架,但是您不能自己构建查询,或者至少选择要更新的字段?
我会做类似的事情:
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);
}
}
当然你应该检查字段是否为false / NULL,因为它没有被修改,或者因为用户实际上想要它是空的(即删除),或者确保在插入时所有的fiels都不是NULL。