无法通过Laravel迁移

时间:2016-12-27 05:50:04

标签: laravel laravel-5.3

enter image description here

我正在尝试将unique添加到产品表中的slug,我进行了以下迁移。但是,当我运行php artisan migrate时,我收到错误。

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddUniqueToProductsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('products', function (Blueprint $table) {
           $table->unique('slug'); 
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('products', function (Blueprint $table) {
            $table->dropUnique('products_slug_unique');
        });
    }
}

错误

  

➜phpartisan migrate

     

[Illuminate \ Database \ QueryException] SQLSTATE [23000]:完整性   约束违规:1062重复输入''为了钥匙   ' products_slug_unique' (SQL:alter table products添加唯一   products_slug_uniqueslug))

     

[Doctrine \ DBAL \ Driver \ PDOException] SQLSTATE [23000]:完整性   约束违规:1062重复输入''为了钥匙   ' products_slug_unique'

     

[PDOException] SQLSTATE [23000]:完整性约束违规:   1062重复录入''对于key' products_slug_unique'

我在这里做错了什么?

3 个答案:

答案 0 :(得分:2)

您可以创建 'slug' 的普通字段并创建 slug 的数据类型为 'string' 并且您可以使用验证器创建唯一的 slug,在这种情况下,您也可以提供自定义响应。

 $validator = Validator::make($request->all(), [
        'slug' => 'required|string|unique:products'
    ]);
 if ($validator->fails()){
  //custom response
 }

答案 1 :(得分:0)

在放置约束之前,将unique列的默认值设置为NULL。由于slug中的值是net to empty但不是null,因此MySql期望''本身是唯一的,因此阻止了对列的唯一约束。

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    DB::statement('UPDATE products SET slug = NULL;');

    Schema::table('products', function (Blueprint $table) {
       $table->unique('slug'); 
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('products', function (Blueprint $table) {
        $table->dropUnique('products_slug_unique');
    });

    DB::statement("UPDATE products SET slug = '';");
}

答案 2 :(得分:0)

如迁移指南中所述,您只需编辑 AppServiceProvider.php 文件并在启动方法中设置默认字符串长度即可解决此问题:

 use Illuminate\Database\Schema\Builder;


public function boot()
{
    Builder::defaultStringLength(191);
}