php – laravel – 將已存在的資料庫匯出 migration 與 seed

匯出 Migration

首先安裝這個套件,先匯出 DB Schema 到 migration

composer require --dev "xethron/migrations-generator"

Laravel 5.5 以後的版本,下載好後就不需安裝任何的 Providers。使用方法如:

// 所有資料表
php artisan migrate:generate

// 指定資料表
php artisan migrate:generate table1,table2,table3,table4,table5

// 所有資料表但排除某些表,可加參數
--ignore="table3,table4,table5"

// 檢視所有可選用的參數
php artisan help migrate:generate

不過資料表欄位的型態,若是 Enum 的時候,目前版本 v2.0.2 會出錯,請修改 src/Xethron/MigrationsGenerator/Generators/FieldGenerator.php

protected function setEnum(array $fields, $table)
{
    foreach ($this->getEnum($table) as $column) {
        $column_name = isset($column->column_name)
            ? $column->column_name
            : $column->COLUMN_NAME;

        $column_type = isset($column->column_type)
            ? $column->column_type
            : $column->COLUMN_TYPE;

        $fields[$column_name]['type'] = 'enum';
        $fields[$column_name]['args'] = str_replace('enum(', 'array(', $column_type);
    }
    return $fields;
}

主要是 MySQL 8 返回的欄位名稱是大寫, MariaDB 返回的是小寫,需要稍作修改就可以了。我提出了合併請求,不過我看目前開發者合併停滯在 2017 年,因為這個功能僅單次使用,我也就不再 fork 了,手改一下就好。

匯出 Seed

接著產出 seed,就下載這個套件

composer require orangehill/iseed

一樣 Laravel 5.4 以後不需要做任何安裝設定。比較麻煩的是要個別指定匯出的資料表名稱,使用方法如

// 匯出所需資料
php artisan iseed my_table
php artisan iseed my_table,another_table

// 產出的 seeder class 名稱加入前綴
php artisan iseed my_table --classnamesuffix=Customizations

// 強制覆蓋已存在的 seed
php artisan iseed users --force

發表迴響