Laravel:具有不同用户表名称的不同列名称

时间:2019-01-21 05:39:44

标签: sql laravel laravel-5

我需要使用表MaxBy(在干净的laravel中为q_users),其列为:usersqID),idqName ),nameqEmail),emailqPass),passwordqEmailVerifiedAt)。 如何使laravel成功使用它们?

2 个答案:

答案 0 :(得分:5)

要更改表格,您可以在模型上执行此操作。

protected $table = 'q_users';

要更改主键,可以执行以下操作:     保护的$ primaryKey ='qID';

要更改其他字段,例如emailnamepassword,可以编写迁移文件以重命名users表中的列。 看起来如下:

Schema::table('users', function (Blueprint $table) {
    $table->renameColumn('name', 'qName');
    $table->renameColumn('email', 'qEmail');
    $table->renameColumn('password', 'qPassword'); 
});

在执行此操作之前,请确保已安装doctrine/dbal软件包。 您可以通过执行以下操作来安装它:

composer require doctrine/dbal

更改emailpassword字段可能会对Laravel的身份验证系统和通知系统产生很多影响。 您需要进行一些更改。

在您的App\Http\Controllers\Auth\LoginController中,您需要添加以下方法,该方法将覆盖AuthenticateUsers特性中的方法。

/**
 * Get the login username to be used by the controller.
 *
 * @return string
 */
public function username()
{
    return 'qEmail';
}

您还需要添加以下方法:

/**
 * Get the password for the user.
 *
 * @return string
 */
public function getAuthPassword()
{
    return $this->qPassword;
}

...,这应该使登录名可以很好地与您的新字段配合使用。

更改电子邮件也可能会破坏“密码重置电子邮件”工作流程。您将需要在用户模型中覆盖以下方法。

/**
 * Get the e-mail address where password reset links are sent.
 *
 * @return string
 */
public function getEmailForPasswordReset()
{
    return $this->qEmail;
}

我不完全确定如何覆盖“验证”工作流程,但是您似乎需要在此处进行更改:

/**
 * Determine if the user has verified their email address.
 *
 * @return bool
 */
public function hasVerifiedEmail()
{
    return ! is_null($this->qEmailVerifiedAt);
}

/**
 * Mark the given user's email as verified.
 *
 * @return bool
 */
public function markEmailAsVerified()
{
    return $this->forceFill([
        'qEmailVerifiedAt' => $this->freshTimestamp(),
    ])->save();
}

/**
 * Send the email verification notification.
 *
 * @return void
 */
public function sendEmailVerificationNotification()
{
    // You probably need to override with your own notification here
    // which would pull your actual email
    $this->notify(new Notifications\VerifyEmail);
}

总而言之,这是一个艰难的决定。我不确定为什么要这么做。 但是,由于您要这样做,因此有一种更简单(尽管仍然不建议这样做),以确保所有新字段都能正常工作。

您可以为修改后的字段定义Accessors。例如,您可以在用户模型中添加以下访问器。

public function getNameAttribute($value)
{
    return $this->qName; 
}

public function getEmailAttribute($value)
{
    return $this->qEmail; 
}

public function getEmailVerifiedAtAttributes($value)
{
    return $this->qEmailVerifiedAt; 
}

...这应该可以使它工作。实际上,对$user->email的任何调用都会从$user->qEmail中提取值。尽管,就像我说的那样,我个人不会推荐它。

编辑:根据您的评论,如果要更改登录表单中的字段名称,还需要更改验证逻辑。因此,在您的LoginController中,您还需要覆盖这些方法。

/**
 * Validate the user login request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return void
 */
protected function validateLogin(Request $request)
{
    $this->validate($request, [
        $this->username() => 'required|string',
        'qPassword' => 'required|string',
    ]);
}

/**
 * Get the needed authorization credentials from the request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return array
 */
protected function credentials(Request $request)
{
    return $request->only($this->username(), 'qPassword');
}

答案 1 :(得分:1)

在模型中使用以下代码。

protected $table = 'q_users';
protected $primaryKey = 'qID' ;
protected $timestamps = false;//only if you don't use anything like created_at or updated_at. Otherwise use the two lines below.
const CREATED_AT = 'qcreated_at';
const UPDATED_AT = 'qupdated_at';

可以代替创建/database/migrations表中的默认用户表。

如果您需要实施身份验证,请在q_users中相应地更改表和/或型号名称。

您无需在模型中定义自定义/config/auth.phpqName字段。通常,Laravel并不关心这一点。您可以手动进行身份验证。 (我更喜欢对应用程序进行手动身份验证。)

如果您想使用qPass脚手架,则可以像这样更改make:auth

LoginController.php

对于密码字段,您可以在模型中进行定义,例如

public function username()
{
    return 'qEmail';
}

关于public function getAuthPassword() { return $this->qPass; } ,据我所知,没有自定义Laravel框架就无法更改它。在您的email_verified_at中,您可以输入自定义字段名称。但这有点冒险。更好的方法是实现自己的自定义验证逻辑。如果需要,您可以实现/vendor/aravel/framework/src/Illuminate/Auth/MustVerifyEmail.php接口。