Laravel在将非空字符串字段设置为空字符串时抛出错误

时间:2018-03-03 12:57:38

标签: laravel laravel-5 factory laravel-5.5 faker

当我尝试执行此代码时(摘录):

// ####_##_##_######_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))

为什么会发生这种情况?如何解决问题?

2 个答案:

答案 0 :(得分:1)

问题是因为首先你要告诉laravel设置一个默认值''之后你设置了一个unique key ..如果有value = ''的行,他们将不会是什么独一无二..唯一键不能有任何默认值..这就是你收到错误的原因

答案 1 :(得分:0)

使用$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,
];

我分享了一个解决方案,即有人可能会陷入混乱。