【问题标题】:Laravel Eloquent how to create UNIQUE constraint with duplicate NULLsLaravel Eloquent 如何使用重复的 NULL 创建 UNIQUE 约束
【发布时间】:2021-08-16 13:07:53
【问题描述】:

我正在使用带有 MS Sql Server 2014 的 Laravel 5。 我想创建一个唯一约束,但它应该允许多个空值。

这是我正在使用的代码。 'passport_no' 必须是唯一的,如果不是 null。

Schema::create('UserProfile', function(Blueprint $table){
    $table->increments('userprofile_id');
    $table->integer('user_id')->unsigned();
    $table->string('passport_no', 50)->unique()->nullable();

    $table->foreign('user_id')->references('id')->on('users')
            ->onUpdate('cascade')->onDelete('cascade');
});

【问题讨论】:

  • 据我所知,MS SQL-Server 不支持开箱即用,但是,从 2008 版开始,您似乎可以work around it。所以您可以手动设置它DB::raw(...); 在您的迁移中的up() 函数中。
  • 我不知道 Laravel 框架是否直接支持过滤索引,但是在 T-SQL 中,你可以创建一个唯一的过滤索引:CREATE INDEX UQ_UserProfile_passport_no ON dbo.UserProfile(passport_no) WHERE passport_no IS NOT NULL。您还可以使用“WHERE passport_no IS NOT NULL”在表上创建一个视图,并在该视图上创建一个唯一索引。

标签: sql-server eloquent laravel-5


【解决方案1】:

这是一个古老的问题,但仍然需要回答。如上所述,2008 年的 SQL Server,包括 Azure SQL,支持一个特殊的索引来解决它。在您的数据库迁移中,您可以检查使用的驱动程序并将数据库构建器标准 SQL 替换为特定于 MSSQL 的语句。

此迁移示例适用于 Laravel 5+,并创建一个用户表,其中包含唯一但可为空的 api_token 列:

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->timestamps();

        $table->string('name', 100)->nullable()->default(null);
        // etc.

        $table->string('api_token', 80)->nullable()->default(null);

        if (DB::getDriverName() !== 'sqlsrv') {
            $table->unique('api_token', 'users_api_token_unique');
        }
    });

    if (DB::getDriverName() === 'sqlsrv') {
        DB::statement('CREATE UNIQUE INDEX users_api_token_unique'
           . ' ON users (api_token)'
           . ' WHERE api_token IS NOT NULL');
    }
}

【讨论】:

  • 为我工作!谢谢!
【解决方案2】:

您可以使用唯一索引并在其过滤器中设置您的条件,例如

passport_no is not null

这样你就可以解决你的问题了

【讨论】:

    猜你喜欢
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多