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
相关产品推荐
相关产品推荐

