gpt4 book ai didi

php - 使用模型工厂、一对一和一对多关系定义 Laravel 外键,而无需创建不必要的模型

转载 作者:可可西里 更新时间:2023-11-01 12:24:17 24 4
gpt4 key购买 nike

最近我一直在尝试通过 Model Factories 和 Faker 使用 Laravel seeding 为我的数据库做种。

对于简单的模式,让它工作起来轻而易举:)。但是,在处理涉及外键和表关系的复杂数据库模式时,我遇到了几个问题:

  • 一对一
  • 一对多
  • 多对多

...就像链接中描述的那样: Laravel 5.1 foreign keys in model factory .

在本主题中,official documentation建议像这样运行数据库种子:

public function run()
{
factory(App\User::class, 50)->create()->each(function ($u) {
$u->posts()->save(factory(App\Post::class)->make());
});
}

...但是此解决方案存在一个问题:当处理许多数据库表并运行许多种子(它们之间有许多关系)时,通常会创建许多不必要的模型方法。例如,如果我们在上述示例之一之前运行 PostsTableSeeder.php,那么所有这些帖子都不会链接到用户,并且永远不会用于测试和开发...

因此寻找一种方法来处理这种情况,我想出了一个适合我的功能性解决方案,避免了不必要地创建那些“孤儿”模型......

因为想分享给大家,所以在回答中简单说明了:)。

最佳答案

所以这是我的解决方案:

这个例子涉及:

  • 用户和个人资料(用于说明一对一关系)
  • 用户和帖子(用于说明一对多关系)

    // ONE TO ONE relationship (with Users already created)
    $factory->define(App\Profile::class, function (Faker\Generator $faker) {
    return [
    'user_id' => $faker->unique()->numberBetween(1, App\User::count()),
    // Rest of attributes...
    ];
    });

    // ONE TO MANY relationship (with Users already created)
    $factory->define(App\Posts::class, function (Faker\Generator $faker) {
    $users = App\User::pluck('id')->toArray();
    return [
    'user_id' => $faker->randomElement($users),
    // Rest of attributes...
    ];
    });

关于php - 使用模型工厂、一对一和一对多关系定义 Laravel 外键,而无需创建不必要的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40829086/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com