迁移就像是数据库的版本控制,让你的团队能够轻松地去定义和共享程序的数据库结构。迁移通常配合 Laravel 的结构生成器,可以轻松生成应用程序的数据库结构。如果团队中有成员在他的本地数据库环境中手动的添加了某个字段,那么你将会面对如何解决数据库迁移的问题。
我们可以使用数据库迁移功能做一些非常有用的操作,下面我们以在平时项目开发中会使用到的系统设置存储表为例:
首先,我们应该创建一下Eloquent模型,使用Artisan命令可以快速的将模型文件生成在app/Models目录下。
php artisan make:model Setting
//使用 --migration或者-m参数可以同时生成数据库迁移文件
此命令会生成app/Models/Setting.php文件,
通过下面的命令生成数据库的迁移文件,如果上面使用了-m或者--migration参数时,可以跳过此步骤:
php artisan make:migration create_settings_table
//生成 database/migrations/2022_04_05_103616_create_settings_table.php 迁移文件
打开上面的数据库迁移类文件(2022_04_05_103616_create_settings_table.php)可以看到里面包含了两个方法:up 和 down 。up 方法用于向数据库中添加新表、列或索引,而 down 方法用于撤销 up 方法执行的操作。然后使用Schema 构建器里的方法对表进行构建工作:
<?php
use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema; //使用Schema
use IlluminateSupportFacadesDB; //引用数据库操作类
return new class extends Migration
{
//运行迁移
public function up()
{
$tableName = Schema::create('settings', function (Blueprint $table) {
global $tableName;
$table->string('key', 64)->primary()->comment('设置的key'); //创建字段key并做为主键
$table->text('value')->comment('设置内容'); //创建字段value类型为text,也可以使用longText、mediumText方法创建对应的类型
});
DB::statement("ALTER TABLE `" . DB::getConfig('prefix') . "settings` comment '系统设置表'"); //表注释
}
//回滚迁移
public function down()
{
Schema::dropIfExists('settings'); //删除表
}
};
然后使用命令,将我们创建的迁移映射到数据库里:
php artisan migrate --env=local --path=./database/migrations/2022_04_05_103616_create_settings_table.php
//Migrating: 2022_04_05_103616_create_settings_table
//Migrated: 2022_04_05_103616_create_settings_table (91.31ms)
连接到数据库里,可以查看到我们已新建了一个表名为:settings的表,列名为key与value,类型与我们上面定义是一样的。
假如我们的迁移数据有问题可以使用下面的命令回滚迁移:
php artisan migrate:rollback
执行后我们的数据表:settings与migrations表里的迁移记录就被删除了。
在大多数情况下,我们都可以使用模型的默认配置,但有的表需要使用一些个性化的设置,这些提供了一些灵活的参数,我们的设置表刚好会使用到几项:
<?php
namespace App/Models;
use Illuminate/Database/Eloquent/Model;//引用Eloquent
class Setting extends Model
{
//protected $table = 'settings';//指定表名字,默认情况下将以[模型名]+复数
protected $primaryKey = 'key'; //使用key做为主键,默认情况下自动创建一个id做为主键
public $incrementing = false; //不使用integer值的主键,默认为自增integer值
protected $keyType = 'string'; //主健为String类型,默认为integer类型
public $timestamps = false; //不主动维护时间戳,默认会自动创建 created_at 和 updated_at 列存在于模型对应的数据库表中。
//如果你需要维护时间,但就不喜欢系统的字段名,可以使用下面的语法定义
//const CREATED_AT = 'creation_date';//创建时间
//const UPDATED_AT = 'updated_date';//更新时间
//protected $dateFormat = 'U';//模型日期字段的存储格式。
//protected $connection = 'sqlite';//默认使用的是应用程序配置的默认数据库连接。要自定义时修改此项
//默认情况下,被实例化的模型不会包含任何属性值。如果想为模型的某些属性定义默认值,可以在模型上定义一个 $attributes 属性
// protected $attributes = [ 'url' => 'https://www.meishiq.com'];
}
在生成模型的同时,你可能还想要各种其他类型的类,例如模型工厂、数据填充和控制器。这些选项可以组合在一起从而一次创建多个类:
# 生成模型和 Flight工厂类...
php artisan make:model Flight --factory//参数简写-f
# 生成模型和 Flight 数据填充类...
php artisan make:model Flight --seed//参数简写-s
# 生成模型和 Flight 控制器类...
php artisan make:model Flight --controller//参数简写-c
# 生成模型,Flight 控制器类,资源类和表单验证类...
php artisan make:model Flight --controller --resource --requests//参数简写-crR
# 生成模型和 Flight 授权策略类...
php artisan make:model Flight --policy
# 生成模型和数据库迁移,Filght 工厂类,数据库填充类和 Flight 控制器...
php artisan make:model Flight -mfsc
# 快捷生成模型,数据库迁移,Flight 工厂类,数据库填充类,授权策略类,Flight 控制器和表单验证类...
php artisan make:model Flight --all
# 生成中间表模型...
php artisan make:model Member --pivot
上面我们已通过数据迁移功能创建好了数据表,现在我们需要在数据表写入一些基本的配置信息,在这里就需要数据填充功能了。
Laravel 内置了一个可为你的数据库填充测试数据的填充类。所有的填充类都放在 database/seeds 目录下。Laravel 默认定义了一个 DatabaseSeeder 类。通过这个类,你可以用 call 方法来运行其他的 seed 类,从而控制数据填充的顺序。
运行 Artisan 命令 make:seeder 可以生成 Seeder,框架生成的 seeders 都放在 database/seeders 目录下:
php artisan make:seeder SettingSeeder
Seeder 类只包含一个默认方法:run。这个方法会在执行 db:seed 这个 Artisan command 时被调用。在 run 方法里,你可以按需在数据库中插入数据。你也可以用 构造查询器 或 Eloquent 模型工厂 来手动插入数据。
如下所示,在默认的 DatabaseSeeder 类中的 run 方法中添加一条数据插入语句:
<?php
namespace DatabaseSeeders;
use IlluminateDatabaseConsoleSeedsWithoutModelEvents;
use IlluminateDatabaseSeeder;
use IlluminateSupportFacadesDB;
class SettingSeeder extends Seeder
{
//批量写入初始化系统设置参数
public function run()
{
DB::table('settings')->insert([
['key' => 'allowcache', 'value' => '1'], //是否开启缓存
['key' => 'allowregister', 'value' => '1'], //是否允许注册
['key' => 'attachmentdirtype', 'value' => 'month'], //附件归档
['key' => 'gzipcompress', 'value' => '0'], //开启Gzip
['key' => 'mobileurl', 'value' => 'http://m.55mx.com'], //手机版地址
['key' => 'sitename', 'value' => '网络人'], //网站名
['key' => 'siteurl', 'value' => 'http://www.55mx.com'], //网站地址
//其它项设置....
]);
}
}
然后使用命令运行Seeders:
php artisan db:seed//执行所有的seeder
php artisan db:seed --class=SettingSeeder//指定要执行的类
除非注明,网络人的文章均为原创,转载请以链接形式标明本文地址:https://www.55mx.com/post/209
《【Laravel笔记】数据库的一些初始化操作(准备工作)》的网友评论(0)