【问题标题】:Extract email field from 'User' model and add it to a seperate model 'Email' via foreign key从“用户”模型中提取电子邮件字段并通过外键将其添加到单独的模型“电子邮件”中
【发布时间】:2020-11-17 22:22:10
【问题描述】:

我是 Laravel 的新手,并被指示将字段“电子邮件”与“用户”模型分开,而是使用与新创建的模型“电子邮件”相对应的 foreign_id。

用户:

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->id();
        $table->integer('email_id');
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
}

电子邮件:

public function up()
{
    Schema::create('emails', function (Blueprint $table) {
        $table->id();
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->boolean('is_active')->default(True);
        $table->timestamps();
    });
}

当然我已经在这些模型中设置了关系。

现在,当新用户通过表单注册时,我想检查输入的邮件地址是否已存在于“电子邮件”表中,以及可能已找到的邮件地址是否将属性“is_active”设置为 true。

目前,RegisterController 中的“验证器”和“创建”功能非常基本:

/**
 * Get a validator for an incoming registration request.
 *
 * @param  array  $data
 * @return \Illuminate\Contracts\Validation\Validator
 */
protected function validator(array $data)
{
    return Validator::make($data, [
        'name' => ['required', 'string', 'max:255'],
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
        'password' => ['required', 'string', 'min:8', 'confirmed'],
    ]);
}

/**
 * Create a new user instance after a valid registration.
 *
 * @param  array  $data
 * @return \App\User
 */
protected function create(array $data)
{
    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
    ]);
}

有没有办法以合理的方式实现这一目标?还有其他文件需要修改才能正常工作吗?

您好, 框架

【问题讨论】:

  • 我很好奇 - 将电子邮件放在单独的表格中的目的是什么?
  • 如果您只需要检查电子邮件是否已经存在,您可以使用exists validation rule。对于第二部分,你必须写一个custom validation rule
  • 我的主管想让我把它放到一个单独的表中,因为有几种类型的用户在不同的模型和迁移中处理。但邮件地址仍然应该是唯一的

标签: php laravel user-registration


【解决方案1】:

由于您要检查数据库中是否不应该存在活动的电子邮件,您需要使用unique 验证规则。 https://laravel.com/docs/7.x/validation#rule-unique

use Illuminate\Validation\Rule;

将此规则添加到您的规则中。

'email' => ['required', 'string', 'email', 'max:255', Rule::unique('emails', 
             'email')->where(function($query) {
              return $query->where('is_active', TRUE);
           })
],

控制器

protected function create(array $data)
{
    $email = Email::create([
          'email' => $data['email']
    ]);

    return User::create([
        'email_id' => $email->id,
        'password' => Hash::make($data['password']),
    ]);
}

【讨论】:

  • 您的示例完美地检查了电子邮件地址是否已存在于“电子邮件”表中。作为一个 php 新手,实际上将经过验证的邮件地址添加到“电子邮件”表中并将相应的 id 添加到“用户”表中仍然存在问题。任何帮助将不胜感激!
  • 是的,当然 :) 如果是小事,请在 cmets 中提及或更新帖子。否则,创建另一个帖子,我会调查它,我相信也会有其他人回复。所以别担心:)
  • adding the validated mail address into the 'Emails' table and adding the corresponding id into the 'Users' table 。我要添加创建语句吗?让我知道您需要什么帮助。
  • 那太好了。谢谢!
  • 我已经更新了答案。如果解决方案解决了您的问题,最好接受答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多