我需要使用表MaxBy
(在干净的laravel中为q_users
),其列为:users
(qID
),id
(qName
),name
(qEmail
),email
(qPass
),password
(qEmailVerifiedAt
)。
如何使laravel成功使用它们?
答案 0 :(得分:5)
要更改表格,您可以在模型上执行此操作。
protected $table = 'q_users';
要更改主键,可以执行以下操作: 保护的$ primaryKey ='qID';
要更改其他字段,例如email
,name
,password
,可以编写迁移文件以重命名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
更改email
和password
字段可能会对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.php
或qName
字段。通常,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
接口。