Laravel 的数据库迁移的方法


Posted in PHP onJuly 31, 2017

本文介绍了Laravel 的数据库迁移的方法,分享给大家,具体如下:

生成迁移

--table 和 --create 选项可用来指定数据表的名称,或是该迁移被执行时会创建的新数据表。这些选项需在预生成迁移文件时填入指定的数据表:

php artisan make:migration create_users_table
php artisan make:migration create_users_table --create=users
php artisan make:migration add_votes_to_users_table --table=users

添加字段

\database\migrations\2017_07_30_133748_create_users_table.php

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
  /**
   * 运行数据库迁移
   *
   * @return void
   */
  public function up()
  {
    //
      Schema::create('users',function (Blueprint $table){
        $table->increments('id')->comment('递增ID');
        $table->string('email',60)->comment('会员Email');
        $table->string('phone',20)->comment('会员手机号');
        $table->string('username',60)->comment('用户名');
        $table->string('password',32)->comment('用户密码');
        $table->char('rank',10)->comment('会员等级');
        $table->unsignedSmallInteger('sex')->comment('性别;0保密;1男;2女');
        $table->unsignedSmallInteger('status')->comment('用户状态');
        $table->ipAddress('last_ip')->default('0.0.0.0')->comment('最后一次登录IP');
        $table->timeTz('last_login')->comment('最后一次登录时间');
        $table->timestamps();
      });
  }

  /**
   * 回滚数据库迁移
   *
   * @return void
   */
  public function down()
  {
    //
    Schema::drop('users');
  }
}

要创建一张新的数据表,可以使用 Schema facade 的 create 方法。create 方法接收两个参数:第一个参数为数据表的名称,第二个参数为一个 闭包 ,此闭包会接收一个用于定义新数据表的 Blueprint 对象

你可以方便地使用 hasTable 和 hasColumn 方法来检查数据表或字段是否存在:

if (Schema::hasTable('users')) {
  //
}
if (Schema::hasColumn('users', 'email')) {
  //
}

如果你想要在一个非默认的数据库连接中进行数据库结构操作,可以使用 connection 方法:

Schema::connection('foo')->create('users', function (Blueprint $table) {
  $table->increments('id');
});

你可以在数据库结构构造器上设置 engine 属性来设置数据表的存储引擎:

Schema::create('users', function (Blueprint $table) {
  $table->engine = 'InnoDB';
  $table->increments('id');
});

重命名与删除数据表

Schema::rename($from, $to);//重命名

//删除已存在的数据表
Schema::drop('users');
Schema::dropIfExists('users');

创建字段

Schema::table('users', function (Blueprint $table) {
  $table->string('email');
});

命令 描述
$table->bigIncrements('id'); 递增 ID(主键),相当于「UNSIGNED BIG INTEGER」型态。
$table->bigInteger('votes'); 相当于 BIGINT 型态。
$table->binary('data'); 相当于 BLOB 型态。
$table->boolean('confirmed'); 相当于 BOOLEAN 型态。
$table->char('name', 4); 相当于 CHAR 型态,并带有长度。
$table->date('created_at'); 相当于 DATE 型态
$table->dateTime('created_at'); 相当于 DATETIME 型态。
$table->dateTimeTz('created_at'); DATETIME (带时区) 形态
$table->decimal('amount', 5, 2); 相当于 DECIMAL 型态,并带有精度与基数。
$table->double('column', 15, 8); 相当于 DOUBLE 型态,总共有 15 位数,在小数点后面有 8 位数。
$table->enum('choices', ['foo', 'bar']); 相当于 ENUM 型态。
$table->float('amount', 8, 2); 相当于 FLOAT 型态,总共有 8 位数,在小数点后面有 2 位数。
$table->increments('id'); 递增的 ID (主键),使用相当于「UNSIGNED INTEGER」的型态。
$table->integer('votes'); 相当于 INTEGER 型态。
$table->ipAddress('visitor'); 相当于 IP 地址形态。
$table->json('options'); 相当于 JSON 型态。
$table->jsonb('options'); 相当于 JSONB 型态。
$table->longText('description'); 相当于 LONGTEXT 型态。
$table->macAddress('device'); 相当于 MAC 地址形态。
$table->mediumIncrements('id'); 递增 ID (主键) ,相当于「UNSIGNED MEDIUM INTEGER」型态。
$table->mediumInteger('numbers'); 相当于 MEDIUMINT 型态。
$table->mediumText('description'); 相当于 MEDIUMTEXT 型态。
$table->morphs('taggable'); 加入整数 taggable_id 与字符串 taggable_type。
$table->nullableMorphs('taggable'); 与 morphs() 字段相同,但允许为NULL。
$table->nullableTimestamps(); 与 timestamps() 相同,但允许为 NULL。
$table->rememberToken(); 加入 remember_token 并使用 VARCHAR(100) NULL。
$table->smallIncrements('id'); 递增 ID (主键) ,相当于「UNSIGNED SMALL INTEGER」型态。
$table->smallInteger('votes'); 相当于 SMALLINT 型态。
$table->softDeletes(); 加入 deleted_at 字段用于软删除操作。
$table->string('email'); 相当于 VARCHAR 型态。
$table->string('name', 100); 相当于 VARCHAR 型态,并带有长度。
$table->text('description'); 相当于 TEXT 型态。
$table->time('sunrise'); 相当于 TIME 型态。
$table->timeTz('sunrise'); 相当于 TIME (带时区) 形态。
$table->tinyInteger('numbers'); 相当于 TINYINT 型态。
$table->timestamp('added_on'); 相当于 TIMESTAMP 型态。
$table->timestampTz('added_on'); 相当于 TIMESTAMP (带时区) 形态。
$table->timestamps(); 加入 created_at 和 updated_at 字段。
$table->timestampsTz(); 加入 created_at and updated_at (带时区) 字段,并允许为NULL。
$table->unsignedBigInteger('votes'); 相当于 Unsigned BIGINT 型态。
$table->unsignedInteger('votes'); 相当于 Unsigned INT 型态。
$table->unsignedMediumInteger('votes'); 相当于 Unsigned MEDIUMINT 型态。
$table->unsignedSmallInteger('votes'); 相当于 Unsigned SMALLINT 型态。
$table->unsignedTinyInteger('votes'); 相当于 Unsigned TINYINT 型态。
$table->uuid('id'); 相当于 UUID 型态。

字段修饰

Schema::table('users', function (Blueprint $table) {
  $table->string('email')->nullable();
});

Modifier Description
->after('column') 将此字段放置在其它字段「之后」(仅限 MySQL)
->comment('my comment') 增加注释
->default($value) 为此字段指定「默认」值
->first() 将此字段放置在数据表的「首位」(仅限 MySQL)
->nullable() 此字段允许写入 NULL 值
->storedAs($expression) 创建一个存储的生成字段 (仅限 MySQL)
->unsigned() 设置 integer 字段为 UNSIGNED
->virtualAs($expression) 创建一个虚拟的生成字段 (仅限 MySQL)

字段更新

Schema::table('users', function (Blueprint $table) {
  $table->string('phone',20)->change();
  $table->string('username',60)->->nullable()->change();
});

重命名字段

Schema::table('users', function (Blueprint $table) {
  $table->renameColumn('from', 'to');
});

字段移除

Schema::table('users', function (Blueprint $table) {
  $table->dropColumn(['last_ip', 'last_login']);
});

在使用字段更新,重命名字段,字段移除之前,请务必在你的 composer.json文件require键名中添加< "doctrine/dbal": "^2.5">值。然后composer update进行更新或

composer require doctrine/dbal

创建索引

$table->string('email')->unique();

Command Description
$table->primary('id'); 加入主键。
$table->primary(['first', 'last']); 加入复合键。
$table->unique('email'); 加入唯一索引。
$table->unique('state', 'my_index_name'); 自定义索引名称。
$table->unique(['first', 'last']); 加入复合唯一键。
$table->index('state'); 加入基本索引。

开启和关闭外键约束

Schema::enableForeignKeyConstraints();
Schema::disableForeignKeyConstraints();

运行迁移

php artisan migrate

在线上环境强制执行迁移

php artisan migrate --force

回滚迁移

若要回滚最后一次迁移,则可以使用 rollback 命令。此命令是对上一次执行的「批量」迁移回滚,其中可能包括多个迁移文件:

php artisan migrate:rollback

在 rollback 命令后加上 step 参数,你可以限制回滚迁移的个数。例如,下面的命令将会回滚最后的 5 个迁移。

php artisan migrate:rollback --step=5

migrate:reset 命令可以回滚应用程序中的所有迁移:

php artisan migrate:reset

使用单个命令来执行回滚或迁移

migrate:refresh 命令不仅会回滚数据库的所有迁移还会接着运行 migrate 命令。所以此命令可以有效的重新创建整个数据库:

php artisan migrate:refresh
// 刷新数据库结构并执行数据填充
php artisan migrate:refresh --seed

使用 refresh 命令并加上 step 参数,你也可以限制执行回滚和再迁移的个数。比如,下面的命令会回滚并再迁移最后的 5 个迁移:

php artisan migrate:refresh --step=5

无法生成迁移文件

在 Laravel 项目中,由于测试,有时候用 PHP artisan make:migration create_xxx_table 创建数据库迁移。如果把创建的迁移文件 database/migrations/2017_07_30_133748_create_xxx_table.php 文件给删除了,再次执行 php artisan make:migration create_xxx_table 会报错:

[ErrorException]                                                                                                                                          

 include(E:\laraver\vendor\composer/../../database/migrations/2017_07_30_133748_create_users_table.php): failed to open stream: No such file or directory 

重新运行 composer update 又可以执行上面的命令了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
我的论坛源代码(五)
Oct 09 PHP
利用static实现表格的颜色隔行显示的代码
Sep 02 PHP
PHP随机数生成代码与使用实例分析
Apr 08 PHP
解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别
Jun 24 PHP
ThinkPHP关于session的操作方法汇总
Jul 18 PHP
php生成QRcode实例
Sep 22 PHP
PHP实现的构造sql语句类实例
Feb 03 PHP
php求数组全排列,元素所有组合的方法
May 05 PHP
php判断文件上传图片格式的实例详解
Sep 30 PHP
php反射学习之不用new方法实例化类操作示例
Jun 14 PHP
php中的依赖注入实例详解
Aug 14 PHP
laravel与thinkphp之间的区别与优缺点
Mar 02 PHP
PHP实现webshell扫描文件木马的方法
Jul 31 #PHP
PHP/ThinkPHP实现批量打包下载文件的方法示例
Jul 31 #PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
Jul 31 #PHP
php实现将二维关联数组转换成字符串的方法详解
Jul 31 #PHP
微信接口生成带参数的二维码
Jul 31 #PHP
PHP判断一个数组是另一个数组子集的方法详解
Jul 31 #PHP
PHP中TP5 上传文件的实例详解
Jul 31 #PHP
You might like
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
深入PHP许愿墙模块功能分析
2013/06/25 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
2014/06/26 PHP
php将字符串随机分割成不同长度数组的方法
2015/06/01 PHP
基于JQuery+PHP编写砸金蛋中奖程序
2015/09/08 PHP
js下判断 iframe 是否加载完成的完美方法
2010/10/26 Javascript
教您去掉ie网页加载进度条的方法
2010/12/09 Javascript
jQuery插件开发全解析
2012/10/10 Javascript
jQuery创建DOM元素实例解析
2015/01/19 Javascript
探索angularjs+requirejs全面实现按需加载的套路
2016/02/26 Javascript
JavaScript实现斗地主游戏的思路
2016/02/29 Javascript
Bootstrap table的使用方法
2016/11/02 Javascript
AngularJS中的JSONP实例解析
2016/12/01 Javascript
微信小程序 自己制作小组件实例详解
2016/12/22 Javascript
微信小程序联网请求的轮播图
2017/07/07 Javascript
基于对象合并功能的实现示例
2017/10/10 Javascript
基于vue+axios+lrz.js微信端图片压缩上传方法
2019/06/25 Javascript
vue实现扫码功能
2020/01/17 Javascript
[01:41]DOTA2超级联赛专访YYF 称一辈子难忘TI2
2013/05/28 DOTA
python网络爬虫之如何伪装逃过反爬虫程序的方法
2017/11/23 Python
Python OpenCV实现视频分帧
2019/06/01 Python
Python基础学习之类与实例基本用法与注意事项详解
2019/06/17 Python
Python使用贪婪算法解决问题
2019/10/22 Python
pytorch实现用CNN和LSTM对文本进行分类方式
2020/01/08 Python
深入浅析Python 函数注解与匿名函数
2020/02/24 Python
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
浅谈HTML5新增和废弃的标签
2019/04/28 HTML / CSS
美国最佳在线航班预订网站:LookupFare
2019/03/26 全球购物
广州某公司软件工程师面试题
2014/12/22 面试题
魅力教师事迹材料
2014/01/10 职场文书
高中生操行评语
2014/04/25 职场文书
公共场所禁烟标语
2014/06/25 职场文书
开业典礼致辞
2015/07/29 职场文书
创业方案:赚钱的烧烤店该怎样做?
2019/07/05 职场文书
go语言中http超时引发的事故解决
2021/06/02 Golang
Python中生成随机数据安全性、多功能性、用途和速度方面进行比较
2022/04/14 Python