Laravel 工厂并选择了一个唯一的 belongsTo 实例

Laravel factory and selected a unique belongsTo instance

我有一段 hasOne 关系,因为 Campaign hasOne Product

Product belongsTo Campaign.

在这种特殊情况下,在 products 数据库 table 中,应该只有一个对 campaign 的唯一引用。我将数据库端的约束设置为 unique。我的问题是,在定义工厂时,我如何确保它选择一个之前由播种者创建的独特活动?

class ProductFactory extends Factory
{
   
    protected $model = Product::class;

   
    public function definition()
    {
        return [
            //
            'name'        => $this->faker->sentence,
            'description' => $this->faker->paragraph,
            'campaign_id' => Campaign::inRandomOrder()->first()->id, # this won't work
        ];
    }

很明显为什么 Campaign::inRandomOrder()->first()->id 不起作用。我不一定想在这里使用 Campaign 工厂来创建新的 Campaign,因为每个实例的创建方式有很多细微差别,我已经在我的 CampaignSeeder

中处理了这一点

我感兴趣的是将创建的每个产品与我播种时尚未声明的 Campaign 相关联。解决此问题的最佳方法是什么?

假设您在广告系列模型

中有关系产品
class ProductFactory extends Factory
{
   
    protected $model = Product::class;

    public function definition()
    {
        return [
            //
            'name'        => $this->faker->sentence,
            'description' => $this->faker->paragraph,
            'campaign_id' => Campaign::doesntHave('product')->first()->id, 
        ];
    }

每次它都会在您的 table 中获得第一个没有产品的广告系列