模型工厂与现有模型的关联

Posted

技术标签:

【中文标题】模型工厂与现有模型的关联【英文标题】:Model Factory association with existing models 【发布时间】:2016-04-30 02:09:45 【问题描述】:

我的 Laravel 5.2 应用程序具有以下结构:

用户: ID 姓名 ...

帖子: ID 标题 身体 user_id (fk)

评论: ID 身体 user_id (fk) post_id (fk)

我想创建几个用户 (20),为每个用户创建一个随机数量的帖子,并为每个帖子创建一个随机数量的 cmets(即使是固定数量也可以)。

我可以创建用户并将帖子分配给每个用户,但我不能将 cmets 分配给每个帖子: 我有这个:

factory(App\User::class, 20)->create()->each(function($u) 
   $u->posts()->saveMany(factory(App\Post::class, 5)->make();
);

我发现了一些东西,但没有用:

factory(App\Comment::class, 100)->create()->each(function($u) 
   $u->user()->sync(
      App\User::all()->random(3)
   );
);

注意:我在模型之间建立了这样的关系: 用户有很多帖子, 用户有很多评论, 帖子有很多评论, 评论属于帖子, 评论属于用户

【问题讨论】:

【参考方案1】:

你可以通过使用你的工厂来嵌套你的下一个孩子等来实现这一点。

您有一些 fk 引用的关系,因此要获得正确的“fk”值,您可以执行以下操作:

factory('App\Users', 123)->create()->each(function ($u) 

        factory('App\Posts', 1)->create([
            'user_id' => $u->id,
        ])->each(function ($e) use ($u) 
            factory('App\Comments', 10)->create([
                'user_id' => $u->id,
                'post_id' => $e->id,
            ]);
        );

    );

create 方法中的数组将覆盖您在ModelFactory.php 中设置的值

【讨论】:

[ErrorException] 未定义属性:Illuminate\Database\Eloquent\Builder::$orders 我更改为 App\User::class 并且错误消失了。 :)) 谢谢你 很高兴我能帮上忙! :) 嗯,这会在他自己的帖子中创建来自同一用户的几个 cmets。但我想它可以用于通用测试,只需用数据填充数据库。

以上是关于模型工厂与现有模型的关联的主要内容,如果未能解决你的问题,请参考以下文章

ecto 变更集为现有添加关联

在 factory_girl 中填充与儿童的关联

将模型 A 与模型 B 和模型 B 的关联关联起来

如何通过关联为 has_many 定义工厂

Sequelize:“模型 A 与模型 B 没有关联”

Laravel 模型关联建立与查询