我想要一个包含两个表Users和Companies的数据库,而users表有一个带有公司ID的外键。所以1家公司可以拥有多个用户。
我在laravel中为此创建了模型,并为每个表创建了一个工厂。
在我的播种机中,我想一次创建多个数据线,并找到了这个解决方案:
factory(App\Company::class, 10)->create();
这适用于公司表。但是我需要为users表扩展它,以便搜索可用的公司ID
我有什么想法可以做到这一点?
如果我不能搜索可用的ID,我也很乐意用“company_id”字段扩展它并从1-10给它随机值(因为我知道这些是现在的ID)。
所以基本上我想扩展它以使用工厂中的字段,但用另一个字段“company_id”扩展它:
factory(App\Users::class, 10)->create();
以下是用户工厂代码:
$factory->define(App\User::class, function (Faker\Generator $faker) {
return [
'first_name' => $faker->firstName,
'last_name' => $faker->lastName,
'postcode' => $faker->postcode,
'city' => $faker->city
];
});
答案 0 :(得分:8)
在处理这种关系时,定义模型工厂可能会很痛苦。你有几个选择。
如果您确定可以使用常见的ID范围,则可以生成随机ID以使关系有效:
$factory->define(App\User::class, function (Faker\Generator $faker) {
return [
// ...
'company_id' => rand(1, 10),
];
});
这是Laracast的截屏视频推广使用最广泛的方法:
$factory->define(App\User::class, function (Faker\Generator $faker) {
return [
// ...
'company_id' => factory(App\Company::class)->create()->id,
];
});
或者您可以反过来在公司工厂中创建一个或多个用户。这样,您只需要在其中一个实体上运行factory()
。
从Laravel的5.2版本开始,您可以访问名为inRandomOrder
的Eloquent方法:
$factory->define(App\User::class, function (Faker\Generator $faker) {
return [
// ...
'company_id' => Company::inRandomOrder()->first()->id,
];
});
Laravel在5.2之前发布的替代方案:
// Laravel 4.2.7 - 5.1:
User::orderByRaw("RAND()")->get();
// Laravel 4.0 - 4.2.6:
User::orderBy(DB::raw('RAND()'))->get();
// Laravel 3:
User::order_by(DB::raw('RAND()'))->get();
// Source: http://stackoverflow.com/a/13931676/65732
答案 1 :(得分:3)
看起来,您想要创建Companies
和Users
,并且您还希望同时将用户与公司相关联。如果这是您想要实现的目标,那么您可以使用以下内容轻松完成:
factory(App\Company::class, 10)->create()->each(function($factory) {
$factory->users()->save(factory(App\User::class)->make());
});
在这种情况下,您必须使用右侧users
在Company
模型中定义foreign key
关系方法。
这将创建10家公司,并使用each
方法返回该集合的集合,将创建一个用户并将其附加到该公司。另外,请检查documentation。
答案 2 :(得分:1)
如果您使用Laravel 5.2或更高版本,可以使用:
'company_id' => Company::inRandomOrder()->first()->id