我正尝试向工厂模型添加一个关系,以执行一些数据库播种,如下所示-注意,我正尝试向每个用户添加2个帖子
public function run()
{
factory(App\User::class, 50)->create()->each(function($u) {
$u->posts()->save(factory(App\Post::class, 2)->make());
});
}
但它抛出以下错误
Argument 1 passed to Illuminate\Database\Eloquent\Relations\HasOneOrMany::s
ave() must be an instance of Illuminate\Database\Eloquent\Model, instance
of Illuminate\Database\Eloquent\Collection given
我认为这与保存一个集合有关。如果通过分别调用post的每个工厂模型来重写代码,它似乎可以工作。显然,这不是很优雅,因为如果我想持久化10或post给每个用户,那么我必须decalare 10或行,除非我使用某种for循环。
public function run()
{
factory(App\User::class, 50)->create()->each(function($u) {
$u->posts()->save(factory(App\Post::class)->make());
$u->posts()->save(factory(App\Post::class)->make());
});
}
已更新
有没有办法把模型工厂嵌套到第三层?
public function run()
{
factory(App\User::class, 50)
->create()
->each(function($u) {
$u->posts()->saveMany(factory(App\Post::class, 2)
->make()
->each(function($p){
$p->comments()->save(factory(App\Comment::class)->make());
}));
});
}
7条答案
按热度按时间6uxekuva1#
自Laravel 5.6起,有一个回调函数afterCreating & afterMaking,允许您在创建/制作后直接添加关系:
现在
我会给予你50个用户,每个有10个职位,每个职位有一个评论。
nr9pn0ug2#
试试这个。对我很有效:
xuo3flqw3#
对于第三层嵌套关系,如果您想创建具有正确的对应外键的数据,您可以循环遍历创建帖子的所有结果,如下所示:
cfh9epnr4#
要回答最初的问题/错误消息:
这个问题确实与保存数据有关。您的代码:
...应改为
来自laravel文件:
您可以使用createMany方法创建多个相关模型:
$user-〉posts()-〉createMany(工厂(应用程序\帖子::类,3)-〉make()-〉toArray());
这意味着
wlwcrazw5#
mw3dktmi6#
**让我来解释一下如何通过新学校和旧学校的概念在Laravel 9中添加多层次的呼叫工厂关系。**新学校是:
这是Laravel 9的。还有一种方法叫Magic方法。让我解释一下:
此
hasArticles()
是父模型中关系的方法名称,应使用has转换名称。例如:将comments()
转换为hasComments()
。现在让我们来解释一下在某些情况下仍然很好的老学校,仍然与拉腊维尔9良好的工作。
当然你可以替换
saveMany()
方法由save()
作为你的关系你有.也你可以替换create()
方法由make()
如果你想要的到不保存在数据库为测试目的.好好享受。
fslejnso7#
在版本laravel 9中,使用如下