Laravel 8工厂多重关系

问题描述

在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
       },],}

解决方法

只需将此添加到您的 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
,

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

的链接

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

如果要使用其他ID,请改用此语法 Link::factory()->count(3)->make()

,

如果您玩些代码会更好。您会更好地理解。

$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();

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...