用模型工厂,一对一和一对多关系定义Laravel外键而不会创建不必要的模型

最近,我一直试图使用Laravel种子模型工厂和Faker来种子我的数据库。用模型工厂,一对一和一对多关系定义Laravel外键而不会创建不必要的模型

对于简单的模式,它只是一件轻而易举的工作:)。然而,其中涉及外键的复杂的数据库模式和表之间的关系工作时,我遇到了几个问题:

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

...就像链接中描述的那样: 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...

    ];

    });

回答:

这里就是让人际关系是方式比随机分配给用户,特别是如果你需要额外的信息发送到这个模型更好的解决方案。

$factory->define(App\Post::class, function (Faker\Generator $faker) { 

$user = factory('App\Models\User')->create(['email' => '[email protected],]);

// 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,

];

}

来源:https://laracasts.com/series/laravel-from-scratch-2017/episodes/22

以上是 用模型工厂,一对一和一对多关系定义Laravel外键而不会创建不必要的模型 的全部内容, 来源链接: utcz.com/qa/261716.html

回到顶部