当我尝试执行此代码时(摘录):
// ####_##_##_######_create_items_table.php
$table->string('seller_sku')->default('')->unique();
// ItemFactory.php
return [
'seller_sku' => $faker->optional($default = '')->word,
];
并运行:php artisan migrate:refresh --seed
它产生:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column
'seller_sku' cannot be null (SQL: insert into `items` (`name`,
`seller_sku`, `category_id`, `current_prize`, `winter`, `updated_at`,
`created_at`) values (facilis, , 44, 131, 1,
2018-03-03 12:18:22, 2018-03-03 12:18:22))
为什么会发生这种情况?如何解决问题?
问题是因为首先你告诉laravel设置一个默认值''
之后你设置一个unique key
..如果有value = ''
的行他们将不再是唯一的...独特的键不能有任何默认值..这就是为什么你收到了一个错误
使用$faker->optional(null,'')->word
解决了这个问题。 The faker documentations有点误导,特别是对于某些人来自Python。
但无论如何,只是在非空列中不允许重复的空字符串,所以我最终做了这个(摘录):
// ####_##_##_######_create_items_table.php
$table->string('seller_sku')->nullable()->unique();
// ItemFactory.php
return [
'seller_sku' => $faker->unique()->optional()->word,
];
我分享了一个解决方案,有人可能会陷入混乱。