iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 9
1
Software Development

30天開發與部署 Laravel 專案系列 第 9

Laravel Migrations

在一般的程式碼版本可以用git來版本控制,而在資料庫呢?
Laravel提供 migrations(遷移),可提供建立資料表與設定欄位屬性之外,更可作為資料庫的版本控制工具。據說 migrations源自 Ruby on Rails,讓每次資料庫變更後紀錄保留一筆migration。

資料庫設置

laravel官方文件寫可支援以下四種資料庫

  • MySQL 5.6+
  • PostgreSQL 9.4+
  • SQLite 3.8.8+
  • SQL Server 2017+

預設是哪個?可從env檔、config/database.php 中確認預設資料庫為 MySQL。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

基本上只要設定env檔,下migrate相關指令後就可直接連結上MySQL。

建立/編輯資料表

生成遷移的基本指令

php artisan make:migration create_users_table

指定資料表的做法

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

指令結束後,會在專案中 database/migrations 路徑底下發現新增的檔案

migration一個基本上會分為兩個區塊

/**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tableName', function (Blueprint $table) {
            $table->string('email')->index();
            $table->string('token');
            $table->timestamp('created_at')->nullable();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('tableName');
    }
  • 先確認資料表名稱
  • 再up裡頭設定這次遷移要做的事
  • 執行 php artisan migrate 會跑 up()裡頭的內容,就可以建立/修改資料表內容

https://ithelp.ithome.com.tw/upload/images/20200923/20125263gxGju6gJN3.png

有問題就會爆紅字

  • 若想回滾遷移可輸入 php artisan migrate:rollback 會跑down() 裡頭的內容回到上一動。
    (官方文件有回滾所有遷移、回滾所有遷移並且再執行一次、強制遷移等指令...)

常用設定/修改欄位

add column:新增欄位

以下是個人常用的

$table->increments('id'); //遞增id 效果等同 UNSIGNED INTEGER
$table->string('email')->unique();  //信箱設定為唯一值
$table->timestamp('token_expire_time',0)->nullable(); //nullable允許空值
$table->float('fruits', 5, 1) ->nullable(); //float最多5位數,小數點後1位
$table->softDeletes();  //軟刪除

foreignkey

先建立欄位,再設定foreignkey條件

$table->unsignedInteger('user_id');            
$table->foreign('user_id')->references('id')->on('users');

renameColumn

前面舊名稱、後面新名稱

$table->renameColumn('plaftfom', 'plaftform');

修改欄位屬性

$table->string('image_path')->nullable()->change(); //最後要加個change

通常在更新、修改欄位時,系統會報錯:

Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found
google大神提供了解答:composer require doctrine/dbal
安裝後重新migrate一次就行囉!

更多用法

讀寫分離資料庫連結方式、SQLite連結方式設定、監聽查詢事件等,可參考官方文件

https://laravel.com/docs/7.x/database

參考資料
https://laravel.tw/docs/5.2/migrations
https://medium.com/@weilihmen/ruby-on-rails-%E8%AB%87migration%E6%A6%82%E5%BF%B5%E8%88%87%E7%94%A8%E6%B3%95-22a52714f51f
https://robertlan.com/programming/php/laravel-%E6%95%99%E5%AD%B8chapter2-%E8%B3%87%E6%96%99%E5%BA%AB%E9%81%B7%E7%A7%BBmigration/
https://stackoverflow.com/questions/33817983/artisan-migration-error-class-doctrine-dbal-driver-pdomysql-driver-not-fo


上一篇
Laravel Routing
下一篇
Eloquent ORM 前置作業:設定Model
系列文
30天開發與部署 Laravel 專案30

尚未有邦友留言

立即登入留言