3. 数据库迁移

未匹配的标注

数据迁移

无符号整型

作为迁移的外键,请使用 unsignedInteger() 类型或 integer()->unsigned() 来替代 integer() ,否则你会得到 SQL 错误。

Schema::create('employees', function (Blueprint $table) {
    $table->unsignedInteger('company_id');
    $table->foreign('company_id')->references('id')->on('companies');
    // ...
});

同样,你可以用 unsignedBigInteger() 如果外键对应的是 bigInteger() 类型。

Schema::create('employees', function (Blueprint $table) {
    $table->unsignedBigInteger('company_id');
});

迁移顺序

如果你想改变数据库迁移的顺序,只需要将文件按时间戳记命名, 就像 2018_08_04_070443_create_posts_table.php 改为2018_07_04_070443_create_posts_table.php (从 2018_08_04 改成了 2018_07_04).

迁移是以字母顺序执行。

带时区的迁移字段

你知不知道在迁移中不止有 timestamps() 还有带时区的 timestampsTz()

Schema::create('employees', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('email');
    $table->timestampsTz();
});

同样,还有这么些列 dateTimeTz()timeTz()timestampTz()softDeletesTz()

数据库迁移字段类型

迁移中有一些有趣的字段类型,下面是一些示例。

$table->geometry('positions');
$table->ipAddress('visitor');
$table->macAddress('device');
$table->point('position');
$table->uuid('id');

官方文档 中你可以找到全部的字段类型列表。

默认时间戳

当创建迁移文件时,你可以使用带useCurrent()useCurrentOnUpdate() 可选项的 timestamp() 类型,这将会设置使相应字段以 CURRENT_TIMESTAMP 作为默认值。

$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrentOnUpdate();
  • 译者注:useCurrent() 会使用当前时间,一般用作创建时间,且不会自动更新;useCurrentOnUpdate() 将会使用当前时间戳,并且在更新时,自动更新时间戳,一般用在 updated_at 字段。

迁移状态

如果你想知道迁移是不是已经运行过了,不需要查看 “migrations” 表,你可以运行 php artisan migrate:status 命令来查看。

结果示例:

+------+------------------------------------------------+-------+
| Ran? | Migration                                      | Batch |
+------+------------------------------------------------+-------+
| Yes  | 2014_10_12_000000_create_users_table           | 1     |
| Yes  | 2014_10_12_100000_create_password_resets_table | 1     |
| No   | 2019_08_19_000000_create_failed_jobs_table     |       |
+------+------------------------------------------------+-------+

创建带空格的迁移

当你打入 make:migration 命令,你不“必须”在不同部分间使用下划线 _ 进行分隔,像是 create_transactions_table 。你可以把名字用引号引起来并把下划线换成空格。

// 这样可以工作
php artisan make:migration create_transactions_table

// 但这样也可以
php artisan make:migration "create transactions table"

来源: Steve O 的 twitter

在另一列的后面创建一列

注意: 仅 MySQL 可用

如果你要在已经存在的表里增加一个新列,这个列不“必须”成为最后一列,你可以指定这个列创建在哪个列的后面:

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

如果你要在已经存在的表里增加一个新列,这个列不“必须”成为最后一列,你也可以指定这个列创建在哪个列的前面:

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

如果你让创建的列排在表中的第一个,那么可以使用 first 方法。

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

为已经存在的表生成迁移文件

如果你要为已经存的表生成迁移文件,而且你想让 Lavarel 来为你生成 Schema::table() 代码,那么,在命令后面加入 in_xxxxx_table ,或者指明 --table 参数。
php artisan change_fields_products_table 生成一个空类。

class ChangeFieldsProductsTable extends Migration
{
    public function up()
    {
        //
    }
}

但是,加入 in_xxxxx_table php artisan make:migration change_fields_in_products_table 生成了填好了 Schemma::table() 的类。

class ChangeFieldsProductsTable extends Migration
{
    public function up()
    {
        Schema::table('products', function (Blueprint $table) {
            //
        })
    };
}

同样,你可以指明 --table 参数 php artisan make:migration whatever_you_want --table=products

class WhateverYouWant extends Migration
{
    public function up()
    {
        Schema::table('products', function (Blueprint $table) {
            //
        })
    };
}

执行迁移前先输出 SQL 语句

当输入 migrate --pretend 命令,你可以得到将在终端中执行的 SQL 查询。如果有需要的话调试 SQL 的方法,这是个很有趣的方法。

// Artisan 命令
php artisan migrate --pretend

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/laravel-tips/8....

译文地址:https://learnku.com/docs/laravel-tips/8....

上一篇 下一篇
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
贡献者:5
讨论数量: 0
发起讨论 只看当前版本


暂无话题~