使用工厂进行Laravel种子填充,但是对其进行扩展。
使用工厂进行Laravel种子填充,但是对其进行扩展。
我希望创建一个数据库,其中包含两个表,用户表和公司表,用户表有一个与公司ID相关联的外键,因此一个公司可以有多个用户。
我在Laravel中创建了这些模型,并为每个表创建了一个工厂。
在我的种子程序中,我希望一次创建多个数据行,找到了这个解决方案:
factory(App\Company::class, 10)->create();
这对于公司表来说运行得很好。但我需要扩展它到用户表,以便查找可用的公司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 ]; });
admin 更改状态以发布 2023年5月24日
看起来,你想同时创建 Companies
和 Users
,并且你希望同时将用户附加到公司中。如果你确实是这样想的,那么你可以轻松地使用以下方法实现:
factory(App\Company::class, 10)->create()->each(function($factory) { $factory->users()->save(factory(App\User::class)->make()); });
在这种情况下,你需要在你的 Company
模型中定义 users
关系方法,并使用正确的 foreign key
。
这将创建10个公司并返回一个集合,使用 each
方法在该集合上创建并附加一个单个的用户。还要检查 文档。
当处理这种关系时,定义模型工厂可能会很繁琐。不过,你有几个选择。
随机盲目ID
如果你确定有一些公共的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()
。
从数据库中随机获取ID
从Laravel 5.2版本开始,你可以访问一个Eloquent方法称为inRandomOrder
:
$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