You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CakePHP 3.6跨两张关联表配置登录提示Users.email字段不存在如何解决

步骤1:修正表关联配置

你当前的关联没有指定用UUID字段绑定,默认会用主键ID做关联,导致关联查询失败。修改两个Table文件的关联代码:

UsersTable.php

public function initialize(array $config)
{
    parent::initialize($config);

    $this->setTable('users');
    $this->setDisplayField('ID');
    $this->setPrimaryKey('ID');
    // 显式指定用UUID字段关联Userdata
    $this->hasOne('Userdata', [
        'foreignKey' => 'UUID', // Userdata表的关联字段
        'bindingKey' => 'UUID' // 当前Users表的关联字段
    ]);
}

UserdataTable.php

不需要保留hasOne('Users'),如果需要反向关联可以按相同规则配置belongsTo,不需要的话直接删除该行即可。


步骤2:在UsersTable中添加自定义认证查询方法

Auth组件默认只会查询Users表的字段,需要自定义查询关联Userdata表,把email查询条件指向关联表:

// 在UsersTable类中添加这个方法
public function findAuth(\Cake\ORM\Query $query, array $options)
{
    return $query
        // 关联加载Userdata数据
        ->contain('Userdata')
        // 指定用Userdata的email字段做用户名校验
        ->where(['Userdata.email' => $options['username']])
        // 选择需要存入会话的字段,可按需调整
        ->select([
            'Users.ID',
            'Users.UUID',
            'Users.password',
            'Userdata.email'
        ]);
}

步骤3:修改Auth组件配置,指定使用自定义查询

修改AppController中的Auth配置,给Form认证添加finder参数,指定用上面写的findAuth方法做查询:

$this->loadComponent('Auth', [
    'authenticate' => [
        'Form' => [
            'fields' => [
                'username' => 'email',
                'password' => 'password'
            ],
            // 新增这一行,指定自定义查询器
            'finder' => 'auth'
        ]
    ],
    'loginAction' => [
        'controller' => 'Users',
        'action' => 'login'
    ],
    'authorize' => ['Controller'],
    'unauthorizedRedirect' => $this->referer()
]);

逻辑说明

密码校验逻辑不需要额外修改,Auth组件会自动校验Users表中返回的password字段和提交的密码是否匹配,登录成功后用户会话中会包含你在findAuth中选择的所有字段,可以直接调用$this->Auth->user('email')获取邮箱信息。

内容的提问来源于stack exchange,提问作者thedoomer1000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 03:57:01