CakePHP:登录 2 个表
CakePHP: Login over 2 tables
我有一个具有新数据库结构的 CakePHP 网站,我想重新配置登录。首先这是我的错误 Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Users.email' in 'where clause'
.
我有 2 个 Table 通过 UUID
字段连接。
Users
Userdata
ID
ID
UUID
UUID
password
email
在旧网站中,电子邮件和密码在同一个 table 但现在不是了。我用插件 bake 创建了 Table / 实体。最后,我在 UsersTable.php 上设置了 $this->hasOne('Userdata');
,在 UserdataTable.php 上设置了 $this->hasOne('Users');
。
UserdataTable.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');
}
}
UserTable.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
class:
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'
另见
我有一个具有新数据库结构的 CakePHP 网站,我想重新配置登录。首先这是我的错误 Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Users.email' in 'where clause'
.
我有 2 个 Table 通过 UUID
字段连接。
Users | Userdata |
---|---|
ID | ID |
UUID | UUID |
password |
在旧网站中,电子邮件和密码在同一个 table 但现在不是了。我用插件 bake 创建了 Table / 实体。最后,我在 UsersTable.php 上设置了 $this->hasOne('Userdata');
,在 UserdataTable.php 上设置了 $this->hasOne('Users');
。
UserdataTable.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');
}
}
UserTable.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
class:
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'
另见