Laravel学习记录--数据填充
Laravel可以用seed
类为数据库填充测试数据。所有的seed
类被存放在database\seeds
目录下。你可以任意为seed
命名,但应该遵守类似UsersTableSeeder
的命名规范。Laravel默认定义的一个DatabaseSeeder
类,可以在这个类中使用call
方法来运行其他的seed
类,从而控制数据填充顺序
生成Seeder
使用命令 php artisan make:seeder MuserTableSeeder
一个seeder类只包含一个默认方法:run
。这个方法会在Atrisan命令db:seed
被执行时调用,在run
方法里你可以根据需要在数据库中插入数据,你也可以有查询构造器或模型工厂来手动插入数据
运行填充命令php artisan db:seed
运行DatabaseSeeder类php artisan db:seed --class=MuserTableSeeder
运行独立的填充类
有些时候你希望在运行迁移命令时填充测试数据,这可以通过不指定值的 --seed选项实现php artisan migrate --seed
php artisan migrate:refresh --seed
第一条命令会在执行迁移命令时运行填充器类DatabaseSeeder填充数据,第二条命令用于回滚所有迁移并重新运行迁移的同时填充初始化数据。
注意 在数据填充期间,批量赋值保护会被自动禁用
编辑填充器
通过命令创建填充器后,我们需要编辑其run
方法设置要填充的数据,正如上面提到的可以使用查询构造器,也可使用模型工厂,这里我们先以查询构造器演示
1.设置Muser的填充器
<?php
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
class MusersTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
DB::table('musers')->insert([
'uname' => str_random(10),
'unick' => bcrypt('secret'),
'country_id'=>mt_rand(30,90)
]);
}
}
2.DatabaseSeeder
的run
方法使用call
调用填充器
public function run()
{
$this->call(MusersTableSeeder::class);
}
3.运行命令php artisan db:seed
查看数据库
确实被填充了一条数据
使用模型工厂
每一次插入一条记录都要编写一条语句,或者手动插入数据是不是很麻烦?数据量小还好,如果数据量成千上万怎么办?显然上面的方法已经不能满足我们的需求,这里就出现了模型工厂,通过模型工厂可以自定义填充规则,自定义填充的记录数。
创建模型工厂
模型工厂存放在database/factories
目录下,Laravel自带了一个用于填充User
模型的模型工厂UserFactory
<?php
use Faker\Generator as Faker;
/*
|--------------------------------------------------------------------------
| Model Factories
|--------------------------------------------------------------------------
|
| This directory should contain each of the model factory definitions for
| your application. Factories provide a convenient way to generate new
| model instances for testing / seeding your application's database.
|
*/
$factory->define(App\User::class, function (Faker $faker) {
return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
'remember_token' => str_random(10),
];
});
在这个模型工厂中通过$factory->define
方法来定义User模型的模型工厂。该方法的第一个参数是模型类,第二个参数是一个匿名函数,在函数中通过Faker
类提供的方法来自定义字段规则,$faker->name
,生成用户名,$faker->unique()->safeEmail
生成唯一的邮箱,最后将这些字段返回(更多Faker的字段规则)
调用模型工厂
在seed类中调用模型工厂使用辅助函数factory()
指定模型类和填充次数,最后链式调用create()
方法即可
该函数第一个参数为使用模型类,为哪一个模型填充数据,第二个参数为填充的次数
简单案例
通过模型工厂填充我们的tests表
1.通过迁移文件创建tests表(表结构如下)
2.创建模型工厂
在database/factories
下创建一个关于Test
模型的模型工厂,命名规则为 驼峰法(模型名Factory
)
如这里我们创建的Test
Model的模型工厂那他的名称应该为TestFactory
<?php
use Faker\Generator as Faker;
/*
$factory->define(App\Test::class, function (Faker $faker) {
return [
'Ip'=>$faker->ipv4,
'name'=>$faker->name,
'sex'=>$faker->randomElement($array = array('男','女')),//随机取性别
'email'=>$faker->email,
'phone'=>$faker->phoneNumber,
'city'=>$faker->city,
'company'=>$faker->randomElement($array = array('华为','小米','乐视','网易')),//随机取公司
'con'=>$faker->realText
];
});
3.调用模型工厂
在database/seeds/DatabaseSeeder
类的run
方法使用factory
调用对应的模型工厂factory(模型类名,填充次数)
由于我们遵从了他的命名规则,当我们输入第一个参数模型类名时,Laravel会自动加载该模型的模型工厂
public function run()
{
factory(\App\Test::class,20)->create();
}
4.运行填充命令,并查看数据库结果php artisan db:seed
上一篇: 使用java代码发送qq邮件
下一篇: 重学计算机组成原理(九)- 动态链接