向 Laravel 工厂模型添加关系

2022-10-21php开发问题
6

本文介绍了向 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 工厂模型添加关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End
Laravel

相关推荐

Laravel Gmail 配置错误
Laravel Gmail Configuration Error(Laravel Gmail 配置错误)...
2024-08-23 php开发问题
16

如何解决“无法与主机 smtp.gmail.com 建立连接"?
How can I solve quot;Connection could not be established with host smtp.gmail.comquot;?(如何解决“无法与主机 smtp.gmail.com 建立连接?)...
2024-08-23 php开发问题
11

带有队列 550 错误的 Laravel 电子邮件(每秒电子邮件太多)
Laravel email with queue 550 error (too many emails per second)(带有队列 550 错误的 Laravel 电子邮件(每秒电子邮件太多))...
2024-08-23 php开发问题
9

Laravel 如何处理 PHP 警告?
How Laravel handles PHP warnings?(Laravel 如何处理 PHP 警告?)...
2024-08-23 php开发问题
12

如何从 laravel 应用程序访问全局变量 $_SESSION 和 $_COOKIE?
How to access the globals $_SESSION and $_COOKIE from a laravel app?(如何从 laravel 应用程序访问全局变量 $_SESSION 和 $_COOKIE?)...
2024-08-14 php开发问题
0

如何在 laravel 5.3 中对多张图片上传进行验证
How to do validation for multiple images upload in laravel 5.3(如何在 laravel 5.3 中对多张图片上传进行验证)...
2024-08-14 php开发问题
0