php - CakePHP:登录 2 个表
问题描述
我有一个具有新数据库结构的 CakePHP 网站,我想重新配置登录。首先这是我的错误Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Users.email' in 'where clause'
。
我有 2 个表,它们通过UUID
字段连接。
用户 | 用户数据 |
---|---|
ID | ID |
UUID | UUID |
密码 | 电子邮件 |
在旧网站中,电子邮件和密码在同一张表中,但现在不在。我用插件烘焙创建了表/实体。最后我设置$this->hasOne('Userdata');
了UsersTable.php 和$this->hasOne('Users');
UserdataTable.php。
用户数据表.php
<?php
namespace App\Model\Table;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;
class UserdataTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->setTable('userdata');
$this->setDisplayField('ID');
$this->setPrimaryKey('ID');
$this->hasOne('Users');
}
}
用户表.php
<?php
namespace App\Model\Table;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;
class UsersTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->setTable('users');
$this->setDisplayField('ID');
$this->setPrimaryKey('ID');
$this->hasOne('Userdata');
}
}
这是在我的 AppController.php
$this->loadComponent('Auth', [
'authorize'=> 'Controller',
'authenticate' => [
'Form' => [
'fields' => [
'username' => 'email',
'password' => 'password'
]
]
],
'loginAction' => [
'controller' => 'Users',
'action' => 'login'
],
//use isAuthorized in Controllers
'authorize' => ['Controller'],
// If unauthorized, return them to page they were just on
'unauthorizedRedirect' => $this->referer()
]);
然后在我的 UsersController.php
public function login()
{
if ($this->request->is('post')) {
$user = $this->Auth->identify();
if ($user) {
$this->Auth->setUser($user);
return $this->redirect($this->Auth->redirectUrl());
}
$this->Flash->error('Your username or password is incorrect.');
}
}
我使用的是 CakePHP 3.6.15 版
解决方案
您需要的是一个自定义查找器,以便您可以修改用于查找用户记录的查询。
最简单、最前向兼容的方式可能是简单地Userdata
在查询中包含关联,并配置表单验证器的username
选项以包含别名,例如,Userdata.email
而不是仅包含email
.
在你的UsersTable
课堂上:
public function findWithUserdata(\Cake\ORM\Query $query, array $options): \Cake\ORM\Query
{
return $query->contain('Userdata');
}
在您的Auth
组件配置中:
'authenticate' => [
'Form' => [
'fields' => [
'username' => 'Userdata.email', // << this one here
'password' => 'password'
],
'finder' => 'withUserData', // << and that one
]
],
这应该会给你一个查找查询,如下所示:
SELECT
...
FROM
users Users
LEFT JOIN
userdata Userdata ON Userdata.UUID = Users.UUID
WHERE
Userdata.email = 'some@email.address'
也可以看看
推荐阅读
- android - 颤振热重载不起作用。需要帮助
- ios - WKWebView 不会打开 @click 侦听器并从 Vue.js 的图标重定向
- java - 从 HTML 中获取标签数组
- beanshell - 我们如何通过Beanshell(Jmeter)中的字符串数组在正文中发送不同的请求
- html - 让 SVG 图标提交搜索查询的输入
- rust - 编译器如何推断此 Box::leak(node).into() 中的类型?
- struct - Rust 中是否保证了初始化结构字段的顺序?
- python - ModuleNotFoundError: No module named... 从子目录导入
- vba - 具有 dlookup 值的条件
- ansible - 使用 ansible 查找超出磁盘限制的虚拟机