PHP-Laravel 框架中,数据填充(模型工厂)

1.创建模型以及生成数据库迁移:php artisan make:model Flight -m

PHP-Laravel 框架中,数据填充(模型工厂)

该命令在app目录下的Models文件中生成了UserInfo模型(如果是php artisan make:model Flight -m,则在app目录下生成模型文件)。-m  是 --migration简写,表示在database\migrations目录下生成一个迁移文件:

PHP-Laravel 框架中,数据填充(模型工厂)

这是我们生成的数据库迁移文件,user_infos表示执行迁移文件后的数据表名:

PHP-Laravel 框架中,数据填充(模型工厂)

请注意,我们并没有告诉 UserInfo模型使用哪个数据表。 除非明确地指定了其它名称,否则将使用类的复数形式「蛇形命名」来作为表名。因此,在这种情况下,Eloquent 将假设 UserInfo模型存储的是 user_infos数据表中的数据。你可以通过在模型上定义 table 属性来指定自定义数据表:

PHP-Laravel 框架中,数据填充(模型工厂)

2.编写数据库迁移文件,我们可以 $table->foreign('user_id')->references('id')->on('users');使用外键约束

PHP-Laravel 框架中,数据填充(模型工厂)

3.我们根据模型文件,创建工厂文件:php artisan make:factory UserInfoFactory --model=Models\UserInfo,文件在database\factories下

PHP-Laravel 框架中,数据填充(模型工厂)

PHP-Laravel 框架中,数据填充(模型工厂)

在这个工厂文件中,我们可以编写模型工厂:https://www.cnblogs.com/jxl1996/p/10335920.html(faker数据填充详解)

PHP-Laravel 框架中,数据填充(模型工厂)

4.现在我们生成填充文件:php artisan make:seeder UserInfoSeeder;文件在database\seeds下

PHP-Laravel 框架中,数据填充(模型工厂)

PHP-Laravel 框架中,数据填充(模型工厂)

我们可以在UserInfoSeeder.php中可以用 查询构造器 或 Eloquent 模型工厂 来手动插入数据。不过我们将使用模型工厂,所以我们在databaseSeeder文件中简单传递要运行的 seeder 类名称即可:

PHP-Laravel 框架中,数据填充(模型工厂)

5.我们在userSeed而文件中,完成数据填充:

PHP-Laravel 框架中,数据填充(模型工厂)

如果我们要关联填充,则必须在User模型中关联UserInfo模型:

PHP-Laravel 框架中,数据填充(模型工厂)

6.至此,我们所有的准备工作已经完成了,现在,我们执行php artisan migrate:fresh --seed,这将删除所有表并重新运行所有迁移。这个命令可以用来重建数据库:

PHP-Laravel 框架中,数据填充(模型工厂)

执行成功!我们已经重新生成了数据表以及填充了数据信息:

PHP-Laravel 框架中,数据填充(模型工厂)

users表:

PHP-Laravel 框架中,数据填充(模型工厂)

user_infos表:

PHP-Laravel 框架中,数据填充(模型工厂)

7.结尾

(1)第3条,我们执行:php artisan make:factory UserInfoFactory --model=Models\UserInfo,会生成:

PHP-Laravel 框架中,数据填充(模型工厂)

如果是php artisan make:factory UserInfoFactory --model=UserInfo,将  是 use App\UserInfo;由于我们生成模型文件时的路径是在app\Models目录下,所以若是该命令--model=UserInfo,将会无法找到该模型文件,只要在UserInfoFactory文件中将use App\UserInfo;改成use App\Models\UserInfo;

(2)如果是一对多,则在User模型中定义:

PHP-Laravel 框架中,数据填充(模型工厂)

在UserSeeder文件中:

PHP-Laravel 框架中,数据填充(模型工厂)

所以我们观察到comments表中数据:一个用户拥有多个评论信息

PHP-Laravel 框架中,数据填充(模型工厂)