Laravel播种使用工厂一对一的关系

时间:2017-06-21 08:12:42

标签: php

我想使用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());
        });
    }
}

我有两个表是users和user_information。他们有一对一的关系。我想与用户播放user_information。但我不知道,我该怎么做......

我的模型关系函数:

user.php的

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

UserInformation.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

2 个答案:

答案 0 :(得分:1)

回答是因为这出现在谷歌搜索中,可能会帮助其他人:

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
    ];
});

答案 1 :(得分: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 factory 将有:

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

如果你只需要在有对应的用户时才创建userInformation表,上面的解决方案会在userinformation表中植入新的user_ids,你最终得到的userinformation行可能比users多。要解决此问题,您只需要在 DatabaseSeeder 运行方法中植入 UserInformation Factory 播种机,而不是 UserFactory。它会自动为 users 表设定种子。

或者,如果您已经定义了 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_id。