问题描述
在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();