Php 不同字段之间的Laravel数据库唯一键

Php 不同字段之间的Laravel数据库唯一键,php,mysql,laravel-5,Php,Mysql,Laravel 5,我正在拉维尔建立一个网站。 用户表有两个电子邮件字段,“电子邮件”字段和“新电子邮件”字段。当用户想要更改电子邮件时,它首先存储在“new_email”中,然后在用户确认后更新“email”字段 很好,但我想限制“new_email”字段与“email”字段相比是唯一的。这样,任何用户都无法将其电子邮件更改为现有用户。我也会在php端进行检查,但我希望数据库限制这一点。。因此,我尝试了以下方法: Schema::table('users', function ($table) {

我正在拉维尔建立一个网站。 用户表有两个电子邮件字段,“电子邮件”字段和“新电子邮件”字段。当用户想要更改电子邮件时,它首先存储在“new_email”中,然后在用户确认后更新“email”字段

很好,但我想限制“new_email”字段与“email”字段相比是唯一的。这样,任何用户都无法将其电子邮件更改为现有用户。我也会在php端进行检查,但我希望数据库限制这一点。。因此,我尝试了以下方法:

    Schema::table('users', function ($table) {
        $table->string('new_email')->unique('email')->nullable();
    });
没有成功,我仍然可以将电子邮件添加到“新”字段,即使电子邮件上是alerady


那么,我如何才能做到这一点呢?

您可以使用Laravel中的请求轻松做到这一点

//在控制器中,您只需按如下方式使用此请求:

<?php namespace App\Http\Controllers;
  use App\Http\Requests\ChangeEmailRequest;
/**
 * Class User
 * @package App\Http\Controllers
 */
 class User extends Controller
 {
     public function changeEmail(ChangeEmailRequest $request)
     {
        // Considering you have user Id with it for updating
        $userId = $request->input('user_id', null);
        $user = User::findOrFail($userId);
        $user->new_email = $request->input('new_email', null);
        $user->save();
        return response($user);
    }
}

不能通过模式强化来实现这一点,索引不能跨列工作。您需要使用与密码请求类似的机制来执行此操作,只需在创建之前检查您要使用的地址是否未被使用,并确保在执行请求之前和之后没有有效的更改请求,因为该电子邮件未被使用。您可能希望为这些内容创建一个单独的表,而不是添加额外的列。您需要在应用程序级别上执行此操作-请参阅和unique validator
<?php namespace App\Http\Controllers;
  use App\Http\Requests\ChangeEmailRequest;
/**
 * Class User
 * @package App\Http\Controllers
 */
 class User extends Controller
 {
     public function changeEmail(ChangeEmailRequest $request)
     {
        // Considering you have user Id with it for updating
        $userId = $request->input('user_id', null);
        $user = User::findOrFail($userId);
        $user->new_email = $request->input('new_email', null);
        $user->save();
        return response($user);
    }
}