【问题标题】:Laravel Seeding using Factory for one to one relationLaravel 播种使用工厂进行一对一关系
【发布时间】:2017-11-24 00:30:07
【问题描述】:

我想使用 laravel 种子创建测试数据。我可以为一张桌子播种。这里是:

ModelFactory.php:

/** @var \Illuminate\Database\Eloquent\Factory $factory */
$factory->define(App\User::class, function (Faker\Generator $faker) {
    static $password;

    return [
        'email' => $faker->unique()->safeEmail,
        'password' => $password ?: $password = bcrypt('secret'),
        'remember_token' => str_random(10),
        'type' => '0'
    ];
});

UsersTableSeeder.php:

<?php

use Illuminate\Database\Seeder;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run() {
        factory(App\User::class, 50)->create()->each(function ($u) {
            $u->posts()->save(factory(App\Post::class)->make());
        });
    }
}

我有两个表,分别是用户和用户信息。它们具有一对一的关系。我想与用户一起播种 user_information。但我不知道,我该怎么办......

我的模型关系函数:

用户.php

public function userInformation() {
        return $this->hasOne('App\UserInformation', 'user_id', 'id');
    }

用户信息.php

public function users() {
        return $this->belongsTo('App\User', 'user_id', 'id');
    }

Laravel 版本是 5.3

我关注了这些文档:

https://laravel.com/docs/5.3/seeding

https://laravel.com/docs/5.3/database-testing#writing-factories

【问题讨论】:

    标签: php


    【解决方案1】:

    对于一对一的关系,最好的做法是使关系方法单一

    用户.php

    public function userInformation() 
    {
         return $this->hasOne('App\UserInformation', 'user_id', 'id');
    }
    

    用户信息.php

    public function user() 
    {
            return $this->belongsTo('App\User', 'user_id', 'id');
    }
    

    Laravel 8 的上述解决方案,userInformation 工厂将有:

    'user_id' => User::factory()->create()->id,
    

    如果您只需要在有相应用户时创建 userInformation 表,上述解决方案会将新的 user_ids 播种到 userinformation 表中,您最终可能会得到比用户更多的 userinformation 行。要解决此问题,您只需在 DatabaseSeeder 运行方法中播种 UserInformation Factory 播种器,而不是 UserFactory。它会自动为用户表播种。

    或者,如果您已经定义了 users 表并希望为您的用户数量播种 userInformation 表。

    对于 Laravel 8,如下图所示:

    public function definition()
    {
        $users = User::all();
        return [
            'name' => $this->faker->company,
            'user_id' => $this->faker->unique()->numberBetween(1, $users->count())
        ];
    

    }

    因为它是一对一的关系。您可以生成用户列表并使用 unique 和 numberBetween 函数来填充唯一的 user_ids。

    【讨论】:

      【解决方案2】:

      回答是因为这出现在 Google 搜索中并可能对其他人有所帮助:

      AFAIK 该模型与播种无关,用于query building and constraints

      可以做的是创建一个用户,每次您调用需要user_id工厂

      感谢prodigy10 这个答案。

      $factory->define(User_Information::class, function ($faker) use ($factory) {
          return [
          'name' => $faker->company(),
          'user_id' => factory(User::class)->create()->id
          ];
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-27
        • 1970-01-01
        • 2019-11-17
        • 2019-01-05
        • 2018-08-11
        • 2015-09-16
        • 2015-12-23
        • 2017-08-02
        相关资源
        最近更新 更多