iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0
Modern Web

跳脫MVC,Laravel + React 建立電商網站系列 第 13

Day 13 淺談 拉拉維爾(Laravel) - Migration

  • 分享至 

  • xImage
  •  

Laravel 做為一個很多php 使用者推崇的框架,它一定有它迷人的地方,今天就來淺窺一下它的魅力吧。
今天這個部分主要會介紹一些常用、實用的小工具,可以讓我們過得更快樂XD
首先,我想先介紹migration這個東西。首先 migration的路徑會放在 /database/migrations/xxxx.php
既然它都放在database的資料夾了,可以很清楚地明白這個工具的目的資料庫有關
實際上的翻譯migration叫做遷移,不過可以把它想像成一個工具,來幫助我們初始化資料表
那初始化資料表用migration寫的好處是什麼?
當我們在多人協作初始專案的時候,我們可以透過migration來確保每個人的資料表結構、命名都一致
避免有人手殘之類的,程式碼一merge就噴掉

基本上的操作指令:

php artisan migration

其他相關的指令可以參考 這裡

基本建構Migration

其實我們到migration的路徑,可以看到一些已經預設好的migration(create_user_table)
我這裡先講migration的命名
基本上的命名規則就是:年_月_日_時間_表名
Laravel再這部分很貼心,當我們要創建新的migration,會在檔案名稱幫我們帶入時間
用時間的原因是為了要判斷migration的先後順序。

<?php 
use Illuminate\Database\Migrations\Migration; 
use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Support\Facades\Schema; 
return new class extends Migration 
{ 
    /** 
     * Run the migrations. 
     * 
     * @return void 
     */ 
    public function up() 
    { 
        Schema::create('users', function (Blueprint $table) { 
            $table->id(); 
            $table->string('name'); 
            $table->string('email')->unique(); 
            $table->timestamp('email_verified_at')->nullable(); 
            $table->string('password'); 
            $table->rememberToken(); 
            $table->timestamps(); 
        }); 
    } 
    /** 
     * Reverse the migrations. 
     * 
     * @return void 
     */ 
    public function down() 
    { 
        Schema::dropIfExists('users'); 
    } 
};

接下來我們看一下

 Schema::create('users', function (Blueprint $table) { 
            $table->id(); 
            $table->string('name'); 
            $table->string('email')->unique(); 
            $table->timestamp('email_verified_at')->nullable(); 
            $table->string('password'); 
            $table->rememberToken(); 
            $table->timestamps(); 
        });

首先,要創建Migration會需要使用到Schema,Schema包含一個create的方法,這個方法就是來幫助我們創建資料表的。
create方法會接收兩個參數,第一個參數是表的名稱,第二個參數會接收一個Blueprint,而Blueprint是用來定義資料表中的欄位數值。
(所以可以看到,在php 的文檔開始,範例先後use 了Schema以及Blueprint)
這裡我特別紀錄一下一開始預設比較特別的各個欄位及使用:
第一個在user之中被設定的就是id,然而id這個function 其實就是bigIncrements 這個function的簡短寫法,特性是會創建一個自動遞增的主鍵(primary key)

string 這個function會創建一個varchar型態的欄位,string其實可以接受兩個參數,第二個參數是字串長度(沒寫的話預設是255)
至於我怎麼知道的,可以參考以下截圖XD
https://ithelp.ithome.com.tw/upload/images/20220917/20145703GROGQo0pZo.png

https://ithelp.ithome.com.tw/upload/images/20220917/20145703OMR284QoQz.png

timestamp 就是timestamp XD,用於時間戳記,感覺沒啥好解釋的
不過有比較特別的是timestamps,他會直接幫我們創造出created_at跟updated_at,這樣一來就可以少寫一行了,讚讚。
這裡可以注意到一些關於時間戳記可以使用的function:useCurrent(預設值為現在時間)、useCurrentOnUpdate(根據目前時間戳更新)

rememberToken 會創造一個"可為null"、varchar (長度100)的欄位,用於存儲當前的“記住我”身份驗證令牌

另外有一些比較常用的可以先了解:

  • nullable($value = true):將欄位設置為 可為null
  • unsigned:將 INTEGER 列設置為 UNSIGNED,UNSIGNED的用途是禁止負數(限整數,不可小數)
  • default:為該欄位設定默認值

更多使用方法可以參考這裡

今天migration就介紹到這邊~
通常都會搭配seed /Factory 一起使用,如果後續篇幅還有時間我們再回過頭來介紹XD


上一篇
Day 12 認識拉拉維爾(Laravel)
下一篇
Day 14 淺談 拉拉維爾(Laravel) - Eloquent ORM
系列文
跳脫MVC,Laravel + React 建立電商網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言