我有一个奇怪的问题。我的员工表中包含 id - > int(11)作为主键。它还有代码 - > varchar(36),密码以及其他一些字段。此代码和密码是员工用于登录系统的两个字段。我用cakePHP表单助手用Code字段和Password字段构建登录页面;事情进展顺利。
今天,当我尝试使用$ this-> Model-> save更新员工表的另一个字段时,它插入了一个新行而不是更新。多数民众赞成,当我得知我需要将代码设置为我的主键。所以我把$primaryKey = 'code'
放在我的员工模型中。
我说的那一刻,登录页面中的Code字段消失了,只留下了Password字段。当我删除$primaryKey = 'code'
时,代码字段又回来了。
因此它与将代码设置为模型中的主键有关。这有什么工作吗?
我需要能够使用代码更新Employee行,并在登录页面中保留我的Code字段。
答案 0 :(得分:0)
听起来code
本质上是一个用户名字段。如果未将code
定义为数据库中的主键,则最好不要将primaryKey
模型属性设置为code
。
我认为大多数人会建议使用主键字段id
告诉Cake哪个Employee记录要更新。但是,如果您必须使用code
,请尝试以下操作:
假设您的code
字段在数据库中具有唯一约束或使用Cake验证进行唯一验证,则可以使用code
查找要更新的记录。获得该记录(在下面的情况下为$current
)后,您就可以获得主键id
,这是必需的,因此Model::save
知道要更新哪条记录。
public function edit($code = null) {
$current = $this->Employee->find('first', array(
'conditions' => array(
'Employee.code' => $code
)
));
$this->Employee->id = $current['Employee']['id'];
if (!$this->Employee->exists()) {
throw new NotFoundException(__('Invalid employee'));
}
if ($this->request->is('post') || $this->request->is('put')) {
if ($this->Employee->save($this->request->data)) {
$this->Session->setFlash(__('The employee has been saved'));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The employee could not be saved. Please, try again.'));
}
} else {
$this->request->data = $current;
}
}