Defining Laravel foreign keys with Model Factories, One to One & One to Many Relationships without creating unnecessary models

后端 未结 2 1762
被撕碎了的回忆
被撕碎了的回忆 2021-02-13 22:54

Recently I have been trying to seed my database using Laravel seeding through Model Factories and Faker.

For simple schemas, it is just a breeze to have it working :). H

相关标签:
2条回答
  • 2021-02-13 23:21

    So here is my solution:

    The example deals with:

    • Users & Profiles (for illustrating One to One relationships)
    • Users & Posts (for illustrating One to Many relationships)

      // 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 讨论(0)
  • 2021-02-13 23:24

    Here is a solution to make relationships that is way better than assigning random Users, especially if you need to send extra information to this model.

    $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,
            ];
        }
    

    And I saw another example with the use of anonymous function

    $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,
        ];
    }
    

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

    0 讨论(0)
提交回复
热议问题