cakephp主键不能用于用户登录

cakephp主键不能用于用户登录,php,cakephp,primary-key,cakephp-model,Php,Cakephp,Primary Key,Cakephp Model,我有一个奇怪的问题。My employee表的主键为id->int(11)。它还有代码->varchar(36),密码和一些其他字段。此代码和密码是员工登录系统时使用的两个字段。我使用cakePHP form helper构建了带有代码字段和密码字段的登录页面;一切都很顺利 今天,当我尝试使用$this->Model->save更新employee表的另一个字段时,它插入了一个新行,而不是更新。那时我才知道我需要将代码设置为主键。所以我把$primaryKey='code'放在我的员工模型中 当

我有一个奇怪的问题。My employee表的主键为id->int(11)。它还有代码->varchar(36),密码和一些其他字段。此代码和密码是员工登录系统时使用的两个字段。我使用cakePHP form helper构建了带有代码字段和密码字段的登录页面;一切都很顺利

今天,当我尝试使用$this->Model->save更新employee表的另一个字段时,它插入了一个新行,而不是更新。那时我才知道我需要将代码设置为主键。所以我把
$primaryKey='code'
放在我的员工模型中

当我输入密码的那一刻,我登录页面上的代码字段消失了,只留下密码字段。当我删除
$primaryKey='code'
时,代码字段返回

因此,它与将代码设置为模型中的主键有关。这方面有什么工作吗


我需要能够使用code更新员工行,并在登录页面中保留我的代码字段。

听起来
code
本质上是一个用户名字段。如果数据库中未将
code
定义为主键,则最好不要将
primaryKey
Model属性设置为
code

我认为大多数人会建议使用主键字段
id
来告诉Cake要更新哪个员工记录。但如果必须使用
code
,请尝试以下操作:

假设您的
code
字段在数据库中具有唯一的约束,或者使用Cake validation进行唯一验证,则可以使用
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;
    }
}

谢谢这解决了我的问题。出于好奇,当我在模型中将其设置为primaryKey时,为什么cake会在登录页面中隐藏代码字段?primaryKey是唯一标识记录的东西。例如,它通常是数据库中的无符号
int
。用户(或您的员工)通常不需要知道此唯一标识符。在Cake中,例如在更新记录/编辑页面上,可以在表单中提交主键以及表单中的用户输入。此表单数据被传递到
Model::save()
,并使用主键知道要更新的记录。因此,如果字段与给定模型的主键相同,则Cake将自动隐藏该字段。