首页 > 解决方案 > 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 版

标签: phpmysqlmodel-view-controllercakephp

解决方案


您需要的是一个自定义查找器,以便您可以修改用于查找用户记录的查询。

最简单、最前向兼容的方式可能是简单地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'

也可以看看


推荐阅读