如果我在表/模型中有 3 个字段但需要超过 1 个项目,如何防止唯一错误? (工厂)

问题描述 投票:0回答:2

我在 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 laravel factory faker
2个回答
0
投票

仅根据您的代码,您应该有一个像这样的工厂:

<?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% 创建一个新模型。您可以在文档上看到这一点。


0
投票

我建议配置您的 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 方法注册,并允许您在制作或创建模型后执行其他任务。

© www.soinside.com 2019 - 2024. All rights reserved.