Laravel 編碼技巧 數(shù)據(jù)庫遷移

2023-02-16 17:10 更新

數(shù)據(jù)遷移

無符號整型

作為遷移的外鍵,請使用 unsignedInteger() 類型或 integer()->unsigned() 來替代 integer() ,否則你會得到 SQL 錯誤。

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

同樣,你可以用 unsignedBigInteger() 如果外鍵對應(yīng)的是 bigInteger() 類型。

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

遷移順序

如果你想改變數(shù)據(jù)庫遷移的順序,只需要將文件按時間戳記命名, 就像 2018_08_04_070443_create_posts_table.php改為 2018_07_04_070443_create_posts_table.php (從 2018_08_04 改成了  2018_07_04).

遷移是以字母順序執(zhí)行。

帶時區(qū)的遷移字段

你知不知道在遷移中不止有 timestamps() 還有帶時區(qū)的 timestampsTz() 。

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

同樣,還有這么些列 dateTimeTz() , timeTz() , timestampTz() , softDeletesTz()

數(shù)據(jù)庫遷移字段類型

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

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

在 官方文檔 中你可以找到全部的字段類型列表。

默認時間戳

當創(chuàng)建遷移文件時,你可以使用帶 useCurrent() 和 useCurrentOnUpdate() 可選項的 timestamp() 類型,這將會設(shè)置使相應(yīng)字段以 CURRENT_TIMESTAMP 作為默認值。

$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrentOnUpdate();
  • 譯者注:useCurrent() 會使用當前時間,一般用作創(chuàng)建時間,且不會自動更新;useCurrentOnUpdate() 將會使用當前時間戳,并且在更新時,自動更新時間戳,一般用在 updated_at 字段。

遷移狀態(tài)

如果你想知道遷移是不是已經(jīng)運行過了,不需要查看 “migrations” 表,你可以運行 php artisan migrate:status 命令來查看。

結(jié)果示例:

+------+------------------------------------------------+-------+
| 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     |       |
+------+------------------------------------------------+-------+

創(chuàng)建帶空格的遷移

當你打入 make:migration 命令,你不 “必須” 在不同部分間使用下劃線 _ 進行分隔,像是 create_transactions_table 。你可以把名字用引號引起來并把下劃線換成空格。

// 這樣可以工作
php artisan make:migration create_transactions_table

// 但這樣也可以
php artisan make:migration "create transactions table"

來源: Steve O 的 twitter

在另一列的后面創(chuàng)建一列

注意: 僅 MySQL 可用

如果你要在已經(jīng)存在的表里增加一個新列,這個列不 “必須” 成為最后一列,你可以指定這個列創(chuàng)建在哪個列的后面:

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

如果你要在已經(jīng)存在的表里增加一個新列,這個列不 “必須” 成為最后一列,你也可以指定這個列創(chuàng)建在哪個列的前面:

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

如果你讓創(chuàng)建的列排在表中的第一個,那么可以使用 first 方法。

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

為已經(jīng)存在的表生成遷移文件

如果你要為已經(jīng)存的表生成遷移文件,而且你想讓 Lavarel 來為你生成 Schema::table() 代碼,那么,在命令后面加入 in_xxxxx_table ,或者指明 --table 參數(shù)。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 參數(shù) php artisan make:migration whatever_you_want --table=products

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

執(zhí)行遷移前先輸出 SQL 語句

當輸入 migrate --pretend 命令,你可以得到將在終端中執(zhí)行的 SQL 查詢。如果有需要的話調(diào)試 SQL 的方法,這是個很有趣的方法。

// Artisan 命令
php artisan migrate --pretend


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號