【问题标题】:Specify a value to create random elements指定一个值以创建随机元素
【发布时间】:2017-09-23 00:35:28
【问题描述】:

我正在尝试使用 faker 为我的数据库播种,但我遇到了一些与外来元素有关的问题。我只有一个用户,但我不知道它的 ID。我希望所有帖子都有它的 ID。
我就是这样做的:

public function run()
{
    factory(App\User::class)->create();
    factory(App\Category::class, 3)->create();

    $user = \App\User::first();

    factory(App\Post::class, 10)->create(['author_id' => $user->id]);
}

这是我的后期工厂:

$factory->define(App\Post::class, function (Faker\Generator $faker) {
    return [
        'title' => $faker->unique()->sentence(5),
        'subtitle' => $faker->optional()->sentence(10),
        'markdown' => $faker->text(500),
        'draft' => $faker->boolean(),
        'category_id' => $faker->numberBetween(1, 6),
    ];
});

db:seed 之后,这是我得到的错误(用户和类别填充得很好):

  SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`laman`.`posts`, CO
  NSTRAINT `posts_author_id_foreign` FOREIGN KEY (`author_id`) REFERENCES `users` (`id`)) (SQL: insert into `posts` (`title`, `slug`, `subtit
  le`, `markdown`, `draft`, `category_id`, `author_id`, `html`, `published_at`, `updated_at`, `created_at`) values (title.,
   slug, , markdown, 0, 6, 1, html, 2017-04-25 20:08:34, 2017-04-25 20:08:34, 2017-04-25
  20:08:34))

这里的用户id是1或者应该是9。为什么?

【问题讨论】:

  • 看起来这每次都会创建一个新用户,但您正在调用表中的第一个用户。是这种情况,还是您刷新迁移?
  • 我删除了用户和类别 un phpmyadmin。有没有更好的方法来截断具有关系的表?
  • 使用php artisan migrate:refresh --seed 将完全回滚和迁移您的数据库以及填充种子文件。只要您在数据库中没有有价值的数据,这很好。使用迁移来管理数据库通常是一种很好的做法,尽管我发现自己每隔一段时间就会手动删除一次。

标签: php laravel laravel-5 faker


【解决方案1】:

我建议您按如下方式播种您的数据库:

  1. 为避免手动删除数据库条目,请使用 DB::table('YourDBTable')->truncate(); 填充您的播种机:

    public function run()
    {
        DB::table('user')->truncate();
        DB::table('posts')->truncate();
    
        factory(App\User::class)->create();
        factory(App\Category::class, 3)->create(); 
    
        $user = \App\User::first();
    
        factory(App\Post::class, 10)->create(['author_id' => $user->id]);
    }
    

现在每次运行 artisan 命令 db:seed 时,都会截断用户表,然后用新数据填充数据库,因此您可以使用 @987654325 获取单个用户和正确的用户@ 方法。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 2013-08-14
相关资源
最近更新 更多