我在 3 个字段上有一个
unique
索引:
public function up(): void
{
Schema::create('items', function (Blueprint $table) {
$table->id();
$table->foreignId('points_id');
$table->foreignId('user_id');
$table->unsignedTinyInteger('status');
$table->timestamp('created_at')->useCurrent();
$table->foreign('user_id')->references('id')->on('users');
$table->foreign('points_id')->references('id')->on('points');
$table->unique(['points_id', 'user_id', 'status']);
});
}
我需要创建一个工厂来创建很多项目,但是如果我创建另一个项目,我无法阻止
unique
错误。
我的 laravel 版本是:
^9.52.10
。
仅根据您的代码,您应该有一个像这样的工厂:
<?php
namespace Database\Factories;
use App\Models\Item;
use App\Models\Point;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<Item>
*/
class ItemFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'points_id' => Point::factory(),
'user_id' => User::factory(),
'status' => fake()->boolean(),
];
}
}
当您仅使用
Model::factory()
时,它将 100% 创建一个新模型。您可以在文档上看到这一点。
我建议配置您的 ItemFactory 以忽略唯一列中的重复:
class ItemFactory extends Factory
{
protected $model = Item::class;
public function definition()
{
return [
'points_id' => function () {
return factory(App\Models\Point::class)->create()->id;
},
'user_id' => function () {
return factory(App\Models\User::class)->create()->id;
},
'status' => $this->faker->randomDigit,
];
}
public function configure()
{
return $this->afterCreating(function (Item $item) {
try {
// Attempt to save the item
$item->save();
} catch (\Illuminate\Database\QueryException $e) {
$this->create();
}
});
}
}
工厂回调使用 afterMaking 和 afterCreating 方法注册,并允许您在制作或创建模型后执行其他任务。