ada*_*m78 13 factory relationship laravel-5.1
我正在尝试添加一个工厂模型的关系来做一些数据库种子,如下所示 - 注意我正在尝试为每个用户添加2个帖子
public function run()
{
factory(App\User::class, 50)->create()->each(function($u) {
$u->posts()->save(factory(App\Post::class, 2)->make());
});
}
Run Code Online (Sandbox Code Playgroud)
但它抛出以下错误
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
Run Code Online (Sandbox Code Playgroud)
我认为它与保存集合有关.如果通过分别调用帖子的每个工厂模型重新编写代码,它似乎工作.显然这不是很优雅,因为如果我想坚持10或发布给每个用户,那么我必须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());
});
}
Run Code Online (Sandbox Code Playgroud)
*更新*
有没有什么方法可以将模型工厂嵌套到第3层?
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());
}));
});
}
Run Code Online (Sandbox Code Playgroud)
pro*_*_24 10
试试这个.它对我有用:
factory(\App\Models\Auth\User::class, 300)->create()->each(function ($s) {
$s->spots()->saveMany(factory(\App\Models\Spots\Parking::class, 2)->create()->each(function ($u) {
$u->pricing()->save(factory(\App\Models\Payment\Pricing::class)->make());
}));
$s->info()->save(factory(\App\Models\User\Data::class)->make());
});
Run Code Online (Sandbox Code Playgroud)
小智 8
对于第 3 级嵌套关系,如果要使用适当的相应外键创建数据,则可以遍历创建帖子的所有结果,如下所示:
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());
});
});
Run Code Online (Sandbox Code Playgroud)
小智 6
要回答最初的问题/错误消息:
问题确实与保存数据有关。您的代码:
$u->posts()->save(factory(App\Post::class, 2)->make());
Run Code Online (Sandbox Code Playgroud)
...应该改为
$u->posts()->saveMany(factory(App\Post::class, 2)->make());
Run Code Online (Sandbox Code Playgroud)
来自Laravel 文档:
您可以使用 createMany 方法创建多个相关模型:
$user->posts()->createMany( factory(App\Post::class, 3)->make()->toArray());
这意味着:
从Laravel 5.6开始,提供了afterCreating和afterMaking回调函数,允许您在创建/制作之后直接添加关系:
$factory->afterCreating(App\User::class, function ($user, $faker) {
$user->saveMany(factory(App\Post::class, 10)->make());
});
$factory->afterMaking(App\Post::class, function ($post, $faker) {
$post->save(factory(App\Comment::class)->make());
});
Run Code Online (Sandbox Code Playgroud)
现在
factory(App\User::class, 50)->create()
Run Code Online (Sandbox Code Playgroud)
将为您提供50位用户,每位用户有10条帖子,每条帖子都有一条评论。
| 归档时间: |
|
| 查看次数: |
9070 次 |
| 最近记录: |