Laravel 8 工厂的多重关系
Posted
技术标签:
【中文标题】Laravel 8 工厂的多重关系【英文标题】:Laravel 8 Multiple Relationships for Factory 【发布时间】: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
,
],
【问题讨论】:
【参考方案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()->count(3)->make()
【讨论】:
以上是关于Laravel 8 工厂的多重关系的主要内容,如果未能解决你的问题,请参考以下文章