Php 使用模型工厂定义Laravel外键,一对一&;一对多关系,无需创建不必要的模型

Php 使用模型工厂定义Laravel外键,一对一&;一对多关系,无需创建不必要的模型,php,laravel,laravel-5,faker,laravel-seeding,Php,Laravel,Laravel 5,Faker,Laravel Seeding,最近,我一直在尝试通过模型工厂和伪造者使用Laravel种子为我的数据库播种 对于简单的模式,让它工作起来很容易:)。但是,我在使用复杂的数据库模式时遇到了几个问题,这些模式涉及到外键和表关系: 一对一 一对多 多对多 …如链接中所述: 在本主题中,建议按如下方式运行数据库种子: public function run() { factory(App\User::class, 50)->create()->each(function ($u) { $u-

最近,我一直在尝试通过模型工厂和伪造者使用Laravel种子为我的数据库播种

对于简单的模式,让它工作起来很容易:)。但是,我在使用复杂的数据库模式时遇到了几个问题,这些模式涉及到外键和表关系

  • 一对一
  • 一对多
  • 多对多
…如链接中所述:

在本主题中,建议按如下方式运行数据库种子:

public function run()
{
    factory(App\User::class, 50)->create()->each(function ($u) {
        $u->posts()->save(factory(App\Post::class)->make());
    });
}
。。。但是这种解决方案有一个问题:当使用许多DB表并运行许多种子(它们之间有许多关系)时,通常使用这种方法创建许多不必要的模型。例如,如果我们在上面的一个示例之前运行PostsTableSeeder.php,那么所有这些帖子都不会链接到用户,也永远不会用于测试和开发

因此,为了寻找一种处理这种情况的方法,我找到了一种功能性的解决方案,它适合我,并且避免了不必要地创建那些“孤立”模型


我想和大家分享,所以答案是:)。

所以我的解决方案是:

该示例涉及:

  • 用户和配置文件(用于说明一对一关系)
  • 用户和帖子(用于说明一对多关系)


这里有一个解决方案,可以使关系比分配随机用户更好,特别是当您需要向此模型发送额外信息时

$factory->define(App\Post::class, function (Faker\Generator $faker) {
    $user = factory('App\Models\User')->create(['email' => 'email@test.com',]);
    // do your relationships here (...)
    return [
        'user_id' => $user->id,
        'title'   => $faker->sentence,
        'body'    => $faker->paragraph,
        ];
    }
我看到了另一个使用匿名函数的例子

$factory->define(App\Post::class, function (Faker\Generator $faker) {
    return [
        'user_id' => function () {
            return factory(App\User::class)->create()->id;
        },
        'title' => $faker->sentence,
        'body'  => $faker->paragraph,
    ];
}

资料来源:

我想你不能为多对多关系提出实现同样目标的最佳方法吗?我有一个User_Cases表来解析多对多的用户和案例。我正在尝试编写一个工厂来为我的数据库种子。我在种子机中使用多对多方法,而不是使用工厂。。。在您的播种器中,您只需检索两个模型(用户和案例)并循环其中一个,在每个案例中分配另一个。如果不将用户的创建放在第二个示例中所示的匿名函数中,那么每次调用factory create/make方法时都会创建一个新的用户模型。如果您将现有用户的
user\u id
传递给factory方法,它仍然会创建一个新用户,即使帖子不会附加到它(它会附加到您提供的用户id)。通过使用第二个示例中的匿名函数,仅当您不向其提供用户id时,它才会创建新用户。
$factory->define(App\Post::class, function (Faker\Generator $faker) {
    return [
        'user_id' => function () {
            return factory(App\User::class)->create()->id;
        },
        'title' => $faker->sentence,
        'body'  => $faker->paragraph,
    ];
}