在以前我们进行数据库数据测试的时候一般是手动的添加数据,比如在数据库查询器中使用sql语句进行数据插入。如果数据较少,那还是蛮轻松的,但是如果数据过大,那就很蛋疼了,即使你将sql语句复制下来。但是这一切,在laravel中都变的非常轻松。
本文实例针对laravel最新的5.3版本进行测试,如若在其它版本出现问题,请在评论区留言。
对于喜欢命令行的朋友来说,laravel的artisan命令简直不能太方便了。
关于artisan的信息,大家可以参考:
英文文档:https://laravel.com/docs/5.3/artisan
中文文档:https://laravel-china.org/docs/5.3/artisan
命令:php artisan make:migration create_users_table
意思:创建一张名为users的表。
接着你便能在database/migrations
这个目录下找到与2014_10_12_000000_create_users_table.php
这个类似的文件。
和以前用php语句创建表一样,我们可以在2014_10_12_000000_create_users_table.php
这个文件中写上我们要创建表的字段及约束条件。
increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}
一个migration
类包含两个方法up
和down
。
up
中主要包含创建表的具体内容。
down
中和前者相反。
Schema::create
接受两个参数。第一个是你要创建表的表名;第二个是一个闭包(匿名函数),获取用于定义新表的 Blueprint 对象。
更多有关Migration的介绍可以参考:https://laravel.com/docs/5.3/migrations#migration-structure
命令 | 描述 |
---|---|
$table->increments('id'); |
数据库主键自增 ID |
$table->integer('votes'); |
等同于数据库中的 INTEGER 类型 |
$table->float('amount'); |
等同于数据库中的 FLOAT 类型 |
$table->char('name', 4); |
等同于数据库中的 CHAR 类型 |
$table->string('name', 100); |
等同于数据库中的 VARCHAR |
$table->dateTime('created_at'); |
等同于数据库中的 DATETIME 类型 |
$table->enum('choices', ['foo','bar']); |
等同于数据库中的 ENUM 类型 |
$table->tinyInteger('numbers'); |
等同于数据库中的 TINYINT 类型 |
$table->timestamps(); |
添加 created_at 和 updated_at 列 |
更多有关列名类型对照的介绍可以参考:https://laravel.com/docs/5.3/migrations#creating-columns
Schema::table('users', function ($table) {
$table->integer('votes')->unsigned(); //无符号类型
});
修改器 | 描述 |
---|---|
->first() |
将该列置为表中第一个列 (仅适用于 MySQL) |
->after('column') |
将该列置于另一个列之后 (仅适用于 MySQL) |
->nullable() |
允许该列的值为 NULL |
->default($value) |
指定列的默认值 |
->unsigned() |
设置integer 列为 UNSIGNED |
生成命令:php artisan migrate
回滚命令:php artisan migrate:rollback
让我们修改 Laravel 安装时自带的 DatabaseSeeder 类,添加一个数据库插入语句到 run 方法:
在database/seeders
目录下我们可以找到DatabaseSeeder.php
这个文件
insert([
'name' => str_random(10),
'email' => str_random(10).'@gmail.com',
'password' => bcrypt('secret'),
]);
}
}
接着执行命令:php artisan db:seed
现在你可以去数据库中查看,会发现新增了一条数据
这里有一个问题,如果我们后期的表多了,那么这样单个填充器类就不会变得无比巨大。在laravel中提供了一个解决方案, 我们可以创建额外的填充器来专门针对一张表。
命令:php artisan make:seeder UserTableSeeder
意思:创建一张名为users的种子类或者理解为填充测试的类。UserTableSeeder
这个名字可以任意取,但是要好分辨。所有框架生成的填充器都位于database/seeders
目录。
insert([
'name' => str_random(10),
'email' => str_random(10).'@gmail.com',
'password' => bcrypt('secret'),
]);
}
}
在 DatabaseSeeder 类中,你可以使用 call 方法执行额外的填充类,使用 call 方法允许你将数据库填充分解成多个文件。
call(UsersTableSeeder::class);
}
}
与前面步骤一样,接着执行命令:php artisan db:seed
现在你可以去数据库中查看,会发现新增了一条数据
方法一和我们以前用sql语句插入一条数据是一样的效果,所以并没有多大的提升。我们想追求的是一次性填充多条测试数据,那么我们可以使用方法二。
手动指定每一个模型填充的属性是很笨重累赘的,在laravel中取而代之的,我们可以使用模型工厂来方便的生成大量的数据库记录。
首先,查看模型工厂文档来学习如何定义工厂,定义工厂后,可以使用帮助函数 factory 来插入记录到数据库。
作为开始,我们看一下 database/factories/ModelFactory.php 文件,该文件包含了一个工厂定义:
define(App\User::class, function (Faker\Generator $faker) {
static $password;
return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'password' => $password ?: $password = bcrypt('secret'),
'remember_token' => str_random(10),
];
});
在闭包中,作为工厂定义,我们返回该模型上所有属性默认测试值。该闭包接收PHP库Faker实例,从而允许你方便地为测试生成多种类型的随机数据。
这里要注意Faker实例,可以参考https://github.com/fzaninotto/Faker
这个Faker实例提供了很多可用的随机数据,比如我们要填充人名,使用
$faker->name
即可,它最后会生成如Prof. King Feil这样的数据。这无疑是非常方便的,可以高度模拟。
更多有关模型工厂的介绍可以参考:
英文文档:https://laravel.com/docs/5.3/database-testing#model-factories
中文文档:https://laravel-china.org/docs/5.3/database-testing#model-factories
create(['password' => bcrypt('123456')]);
}
}
其中factory接受两个参数:一个是Eloquent模型;另一个是插入数据数量。上面run
方法中的语句表示创建50个模型,并将其存到数据库中。
接着让我们回到DatabaseSeeder.php
调用call
方法用于生成测试数据。
执行命令:php artisan db:seed
现在你可以去数据库中查看,会发现新增了50条数据。