cakephp主键不能用于用户登录

时间:2012-07-28 15:19:37

标签: php cakephp primary-key cakephp-appmodel

我有一个奇怪的问题。我的员工表中包含 id - > int(11)作为主键。它还有代码 - > varchar(36),密码以及其他一些字段。此代码和密码是员工用于登录系统的两个字段。我用cakePHP表单助手用Code字段和Password字段构建登录页面;事情进展顺利。

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

我说的那一刻,登录页面中的Code字段消失了,只留下了Password字段。当我删除$primaryKey = 'code'时,代码字段又回来了。

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

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

1 个答案:

答案 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;
    }
}