我想使用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
答案 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。