【问题标题】:Laravel Database Migration Column altered to Unique and Nullable causing errorLaravel 数据库迁移列更改为 Unique 和 Nullable 导致错误
【发布时间】:2019-06-16 08:05:21
【问题描述】:

我正在尝试将社交登录与我现有的 laravel 应用程序集成。我正在尝试将电子邮件和密码更改为可为空,但我还需要电子邮件保持唯一性。在执行我的迁移时,我收到重复键名“users_email_unique”的错误

Laravel 5,已经解决了我在更改列时遇到的枚举问题。

    Schema::table('users', function (Blueprint $table) {
        $table->string('email')->unique()->nullable()->change();
        $table->string('password')->nullable()->change();
    });

Illuminate\Database\QueryException : SQLSTATE[42000]: 语法错误或访问冲突:1061 Duplicate key name 'users_email_unique' (SQL: alter table users add unique users_email_unique(email))

异常跟踪:

1 Doctrine\DBAL\Driver\PDOException::("SQLSTATE[42000]: 语法错误或访问冲突:1061 Duplicate key name 'users_email_unique'")

/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php:119

2 PDOException::("SQLSTATE[42000]: 语法错误或访问冲突:1061 Duplicate key name 'users_email_unique'")

/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php:117

编辑

如果我从电子邮件中删除 Unique(),它是否会保持唯一性,因为它之前是在不同的迁移中设置的?

【问题讨论】:

    标签: laravel doctrine migration dbal


    【解决方案1】:

    听起来数据库正在检测重复值。这对于空值是不可能的,所以它可能是一个空字符串。

    如果是这种情况,您可以在模型中编写一个 mutator 函数来检查值是否为空,然后在它进入数据库引擎之前将其设置为 null,如下所示:

    public function setNameOfYourAttribute($value) {
        if ( empty($value) ) {
            $this->attributes['nameofyourattribute'] = NULL;
        }
    }
    

    希望对你有帮助。

    注意: Full Documentation

    【讨论】:

    • 如果我'更改 $table->string('email')->unique()->nullable()->change();'到'$table->string('email')->nullable()->change();'然后它工作正常,但害怕它失去了我正在编辑的模型的原始迁移中的唯一属性
    【解决方案2】:

    如上述答案的评论中所述,我自己想出了这一点。

    仅仅是因为该表已经使用 unique() 创建,如果我删除它将允许迁移,并且还将保留原始 User 表迁移中的 unique() 功能。

    【讨论】:

      【解决方案3】:

      您可以通过以下方式更改新迁移中的唯一性行为:

      public function up()
      {
          Schema::table('contacts', function (Blueprint $table) {
              $table->dropUnique(['email']);
          });
      }
      
      /**
       * Reverse the migrations.
       *     
      */
      public function down()
      {
          Schema::table('contacts', function (Blueprint $table) {
              $table->string('email')->unique()->change();
          });
      }
      

      Nullable() 属性将保留在 email 列中,因为它是用它创建的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-20
        • 2023-02-06
        • 2021-12-30
        • 1970-01-01
        • 2021-12-19
        • 1970-01-01
        • 2015-03-02
        • 2013-06-30
        相关资源
        最近更新 更多