Laravel 優雅填充 SQL 資料

Celaraze發表於2021-01-26

背景

我們都知道在 Laravel 開發過程中,對於資料庫結構的修改可以通過 migration 完成,對於資料庫生產資料的預填充可以使用 seeder 完成。

如果預填充的資料比較多,而又是在開發過程中產生的,手寫 seeder 中的插入就顯得過於死板,你可能需要一筆一筆的複製修改這些內容:

\DB::table('software_categories')->insert(array(
            0 =>
                array(
                    'id' => 1,
                    'name' => '作業系統',
                    'description' => NULL,
                    'deleted_at' => NULL,
                    'created_at' => '2021-01-19 19:22:31',
                    'updated_at' => '2021-01-19 19:22:36',
                    'parent_id' => NULL,
                    'order' => '0',
                ),
            1 =>
                array(
                    'id' => 2,
                    'name' => '辦公應用',
                    'description' => NULL,
                    'deleted_at' => NULL,
                    'created_at' => '2021-01-19 19:22:53',
                    'updated_at' => '2021-01-19 19:22:53',
                    'parent_id' => NULL,
                    'order' => '0',
                ),
            2 =>
                array(
                    'id' => 3,
                    'name' => '影像處理',
                    'description' => NULL,
                    'deleted_at' => NULL,
                    'created_at' => '2021-01-19 19:22:59',
                    'updated_at' => '2021-01-19 19:22:59',
                    'parent_id' => NULL,
                    'order' => '0',
                ),
            3 =>
                array(
                    'id' => 4,
                    'name' => '網路工具',
                    'description' => NULL,
                    'deleted_at' => NULL,
                    'created_at' => '2021-01-19 19:23:04',
                    'updated_at' => '2021-01-19 19:23:10',
                    'parent_id' => NULL,
                    'order' => '0',
                ),
            4 =>
                array(
                    'id' => 5,
                    'name' => '影音工具',
                    'description' => NULL,
                    'deleted_at' => NULL,
                    'created_at' => '2021-01-19 19:23:35',
                    'updated_at' => '2021-01-19 19:23:35',
                    'parent_id' => NULL,
                    'order' => '0',
                ),
            5 =>
                array(
                    'id' => 6,
                    'name' => '系統工具',
                    'description' => NULL,
                    'deleted_at' => NULL,
                    'created_at' => '2021-01-19 19:23:47',
                    'updated_at' => '2021-01-19 19:23:47',
                    'parent_id' => NULL,
                    'order' => '0',
                ),
            6 =>
                array(
                    'id' => 7,
                    'name' => '設計工具',
                    'description' => NULL,
                    'deleted_at' => NULL,
                    'created_at' => '2021-01-19 19:24:05',
                    'updated_at' => '2021-01-19 19:24:05',
                    'parent_id' => NULL,
                    'order' => '0',
                ),
        ));

這些資料如果夠多,我相信你也一定會找一個好辦法來批量處理。

方案

一,我可以在開發過程中對預填充的資料全部處理完成後,從資料庫匯出 .sql 檔案,再作為指令碼匯入到生產環境。

二,我可以將資料庫中已存在的資料進行結構化處理,生成 seeder 檔案,之後就可以通過 artisan db:seed 命令進行填充。

這兩種方法都可以。

SQL檔案直接匯入

使用資料庫管理工具,如 HeidiSQL 匯出需要的資料庫表至 .sql 檔案。

在 Laravel 中,可以編寫一個 command,邏輯中寫入以下程式碼:

DB::unprepared(file_get_contents('path/data.sql'));

Seeder填充

這是我認為最佳的方案,畢竟 Laravel 提供了完善的資料庫遷移和填充機制,何不利用它?

執行 composer require orangehill/iseed -vvv 安裝包。

執行 php artisan iseed table_name 會自動在 database/seeders 目錄中建立對應表名的 seeder 檔案。

而後,我們就可以使用 artisan db:seed --class=YourTableSeeder 來指定填充。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章