本文目录
前言
在
Laravel
框架中,数据迁移(Migration
)和填充器(Seeder
)是管理数据库结构和初始数据的强大工具。数据迁移允许我们以版本控制的方式管理数据库结构的变化,确保数据库结构的一致性和可维护性。而填充器则用于在数据库迁移后快速填充初始数据,为应用的进一步开发提供基础数据支持。
本指南将深入讲解Laravel
中的数据迁移和填充器操作,从迁移文件的创建与编写、执行迁移文件,到填充器的创建、编写与执行,全面覆盖这两个功能点的关键步骤和注意事项。通过本指南的学习,您将能够熟练掌握Laravel
中的数据迁移和填充技术,为构建高效、可扩展的Web
应用奠定坚实的基础。无论您是Laravel
的新手还是有一定经验的开发者,本指南都将为您提供宝贵的参考和实用的技巧。
1、数据表的迁移(重点)
迁移:创建数据表的操作 + 删除数据表的操作。
填充:往数据表里填充写入测试的数据(数据的插入操作)。
1.1 数据的迁移操作
在迁移过程中,操作可以分为两个部分:创建与编写迁移文件、执行迁移文件。
1.1.2 迁移文件的创建与编写
迁移文件默认的位置:
1、创建迁移文件
例:需要创建试卷的数据表,假设数据表的名字叫做paper。迁移文件名:create_paper_table
创建的时候可以通过自动代码生成工具artisan命令来执行迁移文件的生成。
php artisan make:migration 迁移文件名
在写之前含义如下:
Schema门面(类)是用于操作数据表的门面,调用其具体的方法之后就可以实现创建数据表与删除数据表,语法如上。
实现试卷表paper的创建:
id 表的主键,自增
Paper_name 试卷名称,唯一,varchar(100),不为空
Total_score 试卷总分,整型数字,tinyint,默认为100
Start_time 试卷开始考试时间,时间戳类型(整型int)
Duration 考试时间长度,单位分钟,整型tinyint
Status 试卷是否启用的状态,1表示启用,2表示禁用,默认为1,tinyint类型。
在创建数据表的列的时候遵循语法:
$table
表示整个表的实例
语法:$table
-> 列类型方法(字段名, [长度/值范围]) -> 列修饰方法([修饰的值]);
列类型方法的作用:指定列的名称并且设置列的类型长度或者其值范围(仅针对枚举)。修饰方法:主要是补充列的一些特征,例如有些列不能为空,或者有默认值等等。
常见的修饰方法有:
comment() 添加注释信息
default() 指定列的默认值
nullable() 允许该列的值为NULL
nusigned() 设置无符号的
常用的列类型:
列类型 | 解释 |
---|---|
$table -> string(‘email’) | 等同于数据库中的VARCHAR列 |
$table -> string(‘name’, 100) | 等同于数据库中的VARCHAR,带一个长度 |
$table -> increments(‘id’) | 数据库主键自增ID |
$table -> tinyInteger(‘numbers’) | 等同于数据库中的TINYINT类型 |
$table -> integer(‘votes’) | 等同于数据库中的INTEGER类型 |
$table -> enum(‘choices’, [‘foo’, ‘bar’]) | 等同于数据库中的ENUM类型 |
创建数据表的迁移代码:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePaperTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('paper', function (Blueprint $table) {
// id 表的主键、自增
$table->increments('id') -> comment('自增主键');
// paper_name 试卷名称,唯一,varchar(100),不为空
$table->string('paper_name', 100) -> comment('试卷名称') -> unique();
// Total_score 试卷总分,整型数字,tinyint,默认为100
$table->tinyInteger('total_score') -> comment('试卷总分') -> default(100);
//start_time 试卷开始考试时间,时间戳类型(整型int)
$table->integer('start_time') -> comment('考试开始时间');
// duration 考试时间长度,单位分钟,整型tinyint
$table->tinyInteger('duration') -> comment('考试时长');
// status 试卷是否启用状态:1、表示启用。2、表示禁用。默认为1,tinyint类型
$table->tinyInteger('status') -> comment('试卷启用状态') -> default(1);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('paper');
}
}
如下:
1.2 执行迁移文件
执行分为up执行和down执行。
1.2.1 up方法的执行:
如果在当前的项目中第一次执行迁移文件的话,则需要先去执行(从而产生一个迁移记录表):
php artisan migrate:install
作用:用于创建记录迁移文件的记录数据表(可以看作类似于svn的版本控制机制)。
需要执行up方法,则需要执行命令:(注意:需要删除系统自带的迁移文件,只保留自己的)php artisan migrate
1.2.2 Down 方法执行:
down方法执行:(回滚操作,删除数据表)
php artisan migrate:rollback
【回滚最后一次(批次号,针对的是批次号,不是单个表)的迁移操作,回滚操作不删除迁移文件】
回滚操作只删除迁移表中的记录和对应的数据表,其他操作不执行。
注意:删除(回滚之后)会删除上一个批次的迁移记录,并且同批次建立的数据表也会删除,但是迁移文件依旧存在,方便后期继续迁移(创建数据表)。
批次号:同一次被执行的多个迁移文件其批次号相同。
针对迁移文件名的提示:如果迁移文件已经创建好并且执行了,就不要去修改迁移文件的名称,容易出错的。
2、数据表填充器
填充操作就是往数据表中写测试数据的操作(增加操作),在开发阶段是很实用的功能。
2.1 填充器(种子文件)的创建与编写
2.1.1、填充器默认的所在目录
2.1.2、创建填充器
php artisan make:seeder 填充器名称
【约定俗成的写法,大写表名 + TableSeeder】
例:以paper为例,则名称应该为PaperTableSeeder
php artisan make:seeder PaperTableSeeder
创建好的种子文件:
2.1.3、【重点】编写填充器代码
实现往数据表中写入数据
注意:在填充器文件中可以使用DB门面去新增数据,但是需要注意,DB门面在使用的时候不需要用户自己引入,一旦引入则报错,可以直接使用。建议使用DB门面方法写入新的数据。
使用DB类进行数据写入:
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class PaperTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
\DB::table('paper') -> insert([
[
'paper_name' => '小学1年级语文考试',
'total_score' => 100,
'start_time' => time() + 86400,
'duration' => 120,
'status' => 1
],
[
'paper_name' => '小学1年级数学考试',
'total_score' => 100,
'start_time' => time() + 86400,
'duration' => 120,
'status' => 1
],
[
'paper_name' => '小学1年级体育考试',
'total_score' => 100,
'start_time' => time() + 86400,
'duration' => 120,
'status' => 1
],
]);
}
}
2.2 执行填充器文件
命令:
php artisan db:seed --class=需要执行的种子文件名(不带.php)
种子文件不像迁移文件,迁移操作有单独的对应关系表去记录,由于种子文件的执行没有任何的记录,所以在执行种子文件的时候需要指定需要执行的种子文件。
在学习的php的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。