2016-11-27 69 views
1

最近,我一直试图使用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,那么所有这些帖子都不会被链接到用户,并且永远不会被用于测试和开发中...

因此,搜索处理这种情况的方式,我已经找到了一个适用于我的功能性解决方案,并避免了那些'孤儿'模型的不必要的创建...

我想与大家分享,所以它只是解释在答案:)。

回答

8

因此,这里是我的解决方案:

的例子有涉及:

  • 用户&型材(为了说明一对一关系)
  • 用户&帖子(用于说明一对多关系臀部)

    // 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... 
        ]; 
    }); 
    
+0

我不认为你可以建议,实现了许多相同的的最佳途径很多关系?我有用户和案例与User_Cases表来解决多对多。我试图写一个工厂来播种我的数据库。 – Kenilik

+1

我在播种机内获得**多对多**的方法,而不是工厂......在播种机中,您需要简单地检索两个模型(*用户*和*个案*),并通过其中一个指派另一个模型(s)在每种情况下。 – andcl

0

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

$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

相关问题