向 Laravel 工厂模型添加关系

Adding Relations to Laravel Factory Model(向 Laravel 工厂模型添加关系)
本文介绍了向 Laravel 工厂模型添加关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我正在尝试添加与工厂模型的关系以进行一些数据库播种,如下所示 - 请注意,我正在尝试向每个用户添加 2 个帖子

I'm trying to add a relation to a factory model to do some database seeding as follows - note I'm trying to add 2 posts to each user

public function run()
{
   factory(AppUser::class, 50)->create()->each(function($u) {
         $u->posts()->save(factory(AppPost::class, 2)->make());
   });
}

但它抛出以下错误

Argument 1 passed to IlluminateDatabaseEloquentRelationsHasOneOrMany::s  
ave() must be an instance of IlluminateDatabaseEloquentModel, instance 
of IlluminateDatabaseEloquentCollection given

我认为这与保存集合有关.如果通过分别调用帖子的每个工厂模型来重新编写代码,它似乎可以工作.显然这不是很优雅,因为如果我想保留 10 个或发布给每个用户,那么我必须声明 10 或行,除非我使用某种 for 循环.

I think its something to do with saving a collection. If re-write the code by calling each factory model for the post separately it seems to work. Obviously this isn't very elegant because if I want to persist 10 or post to each user then I'm having to decalare 10 or lines unless I use some kind of for loop.

public function run()
{
   factory(AppUser::class, 50)->create()->each(function($u) {
     $u->posts()->save(factory(AppPost::class)->make());
     $u->posts()->save(factory(AppPost::class)->make());
   });
}

* 更新 *

有没有办法把模型工厂嵌套到第三层深?

Is there any way to nest the model factory a 3rd level deep?

public function run()
{
   factory(AppUser::class, 50)
       ->create()
       ->each(function($u) {
           $u->posts()->saveMany(factory(AppPost::class, 2)
                    ->make()
                    ->each(function($p){
                          $p->comments()->save(factory(AppComment::class)->make());
          }));
   });
}

推荐答案

从 Laravel 5.6 开始就有回调函数 afterCreating &afterMaking 允许您在创建/制作后直接添加关系:

Since Laravel 5.6 there is a callback functions afterCreating & afterMaking allowing you to add relations directly after creation/make:

$factory->afterCreating(AppUser::class, function ($user, $faker) {
    $user->saveMany(factory(AppPost::class, 10)->make());
});

$factory->afterMaking(AppPost::class, function ($post, $faker) {
    $post->save(factory(AppComment::class)->make());
});

现在

factory(AppUser::class, 50)->create()

会给你 50 个用户,每个用户有 10 个帖子,每个帖子有一个评论.

will give you 50 users with each having 10 posts and each post has one comment.

这篇关于向 Laravel 工厂模型添加关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

In PHP how can you clear a WSDL cache?(在 PHP 中如何清除 WSDL 缓存?)
failed to open stream: HTTP wrapper does not support writeable connections(无法打开流:HTTP 包装器不支持可写连接)
Stop caching for PHP 5.5.3 in MAMP(在 MAMP 中停止缓存 PHP 5.5.3)
Caching HTTP responses when they are dynamically created by PHP(缓存由 PHP 动态创建的 HTTP 响应)
Memcached vs APC which one should I choose?(Memcached 与 APC 我应该选择哪一个?)
What is causing quot;Unable to allocate memory for poolquot; in PHP?(是什么导致“无法为池分配内存?在 PHP 中?)