【问题标题】:Laravel 8 Multiple Relationships for FactoryLaravel 8 工厂的多重关系
【发布时间】:2020-12-28 11:44:03
【问题描述】:

在 Laravel 8 中,可以快速填充与工厂的关系。但是,我无法弄清楚如何生成多个关系。 如何使用新的 Laravel 8 语法为每个链接创建随机或新关系?

这种工厂语法仅在 Laravel 8 中可用。 https://laravel.com/docs/8.x/database-testing#factory-relationships

问题

考虑以下关系:

  • 每个链接都属于一个网站和一个帖子。
  • 网站和帖子都可以有很多链接。
<?php

class Post extends Model
{
    use HasFactory;

    function links()
    {
        return $this->hasMany(Link::class);
    }
}

class Website extends Model
{
    use HasFactory;

    function links()
    {
        return $this->hasMany(Link::class);
    }
}

class Link extends Model
{
    use HasFactory;

    function post()
    {
        return $this->belongsTo(Post::class);
    }

    function website()
    {
        return $this->belongsTo(Website::class);
    }
}


我尝试过/想要什么

我在下面尝试的只会为所有链接生成一个模型。 如何使用新的 Laravel 8 语法为每个链接创建随机或新关系?

Link::factory()->count(3)->forPost()->forWebsite()->make()

=> Illuminate\Database\Eloquent\Collection {#4354
     all: [
       App\Models\Link {#4366
         post_id: 1,
         website_id: 1,
       },
       App\Models\Link {#4395
         post_id: 1, // return a different ID
         website_id: 1,
       },
       App\Models\Link {#4370
         post_id: 1, // return a different ID
         website_id: 1, // return a different ID
       },
     ],
   }

【问题讨论】:

    标签: php laravel laravel-factory


    【解决方案1】:

    只需将此添加到您的LinkFactory

      public function definition()
      {
        return [
            'post_id' => function () {
                return Post::factory()->create()->id;
            },
    
            .....
        ];
    }
    

    现在您可以为每个新链接创建新帖子:

    Link::factory()->count(3)->create();//Create 3 links with 3 new posts
    

    或将新链接附加到现有帖子:

    Link::factory()->count(3)->create(['post_id' => Post::first()->id]); //create 3 links and 0 new posts
    

    【讨论】:

      【解决方案2】:

      如果你玩代码会更好。你会更好理解的。

      $user = User::factory()
                  ->has(Post::factory()->count(3), 'posts')
                  ->create();
      

      以上代码将为单个用户创建三个帖子。它将插入三个帖子行和一个用户行。另一方面,下面的代码似乎将为名为 Jessica Aercher 的用户插入三个帖子,也就是说它不会插入用户。

      $posts = Post::factory()
                  ->count(3)
                  ->for(User::factory()->state([
                      'name' => 'Jessica Archer',
                  ]))
                  ->create();
      

      【讨论】:

        【解决方案3】:

        laravel 魔法工厂方法for 允许您使用外部表中的一条记录填充数据库。请参阅文档链接https://laravel.com/docs/8.x/database-testing#belongs-to-relationships

        在您的情况下,使用 forPost()forWebsite() 将允许您使用 Post 表和 Website 表中的一个 id 填充数据库。

        如果您想使用不同的 ID,请改用此语法 Link::factory()-&gt;count(3)-&gt;make()

        【讨论】:

          猜你喜欢
          • 2021-06-29
          • 2017-10-22
          • 2021-06-30
          • 2021-11-06
          • 2021-03-11
          • 2018-06-13
          • 2021-11-18
          • 1970-01-01
          • 2018-08-11
          相关资源
          最近更新 更多