我正在尝试将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_unique
(slug
))[Doctrine \ DBAL \ Driver \ PDOException] SQLSTATE [23000]:完整性 约束违规:1062重复输入''为了钥匙 ' products_slug_unique'
[PDOException] SQLSTATE [23000]:完整性约束违规: 1062重复录入''对于key' products_slug_unique'
我在这里做错了什么?
答案 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);
}