Model 跟 Migration在Laravel中的作用是甚麼?有甚麼差別?

一些model&migration的基礎觀念

甚麼是Model?

Laravel包含Eloquent,這是一種Object Relational Mapping(ORM),ORM在後端開發中的角色是在資料庫和Model資料容器的溝通工具,是一個幫助使用者更簡便、安全的去從資料庫讀取資料。使用 Eloquent 時,每個database table都有一個對應的“Model”,用於與table進行溝通。除了從database table中檢索記錄之外,Eloquent Model也可以輕易地從table中插入,更新和刪除記錄。簡單來說,因為有ORM的關係,Model可以不需要透過SQL語句操作資料庫,事實上,有一種常見的資安漏洞是使用SQL Injection的方式攻擊系統,所以如果可以透過Model新增、刪除、更新、選擇,就可以避開這個常見的資安漏洞增加安全性。

Model是為database提供“包裝”的。因為本身包含函數,所以我們不必執行複雜/長 SQL 查詢來執行Model。也可以將Model視為“優化的數據庫”(在易用性方面)。

如何新增一個Model?

php artisan make:model -m <Model名稱>

一般而言,我們會新增一個Model的時候順帶新增一個Migration,這時我們會在指令後加上-m。

案例示範 :

預期資料表欄位內新增"title","body","category_id"

class Article extends Model
{
    use HasFactory;

    protected $fillable = [
        'title',
        'body',
        'category_id'
    ];
}

預設情況下,model 的物件,並不會將關聯的 model 資料一起帶出來。以上面的示範為例,這個Article物件只會有category_id的資料,但不會有category內其他的資料,所以如果需要將關聯的model資料帶出我們可以在Article class內加上以下的function :

public function category()
    {
        return $this->belongsTo(Category::class);
    }

甚麼是Migration?

Migration是一種資料庫的版本控制,讓使用者能夠輕鬆的修改跟共享應用程式的資料庫結構。Migration通常會跟 Model搭配,讓我們能夠輕鬆的建構應用程式的資料庫結構。

如何新增一個Migration?

如上述所說,我們會在新增Model的時候會順帶新增Migration,但如果我們希望單獨新增一個Migration 我們可以下這個指令 :

php artisan make:migration create_article_table
案例示範 :

Migration會有兩個方法:up & downup 方法被用於新增新資料表、欄位、或索引到你的資料庫,而 down 方法則會回朔 up 的執行操作。

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('body');
            $table->timestamps();

            $table->unsignedBigInteger('category_id')->index();
            $table->foreign('category_id')
                ->references('id')
                ->on('categories')
                ->onDelete('cascade');         
 
/*將category_id關連到categories這張table的id這個column; onDelete('cascade')這個參數是為了在刪除categories內的資料,可以自動更改groups的資料。*/

        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('articles');       //刪除Article資料表
    }
};

如何執行migration?

php artisan migrate

要注意migrate只能執行一次,如果有新的結構或關係需要被進入到資料庫,我們可以refresh他。如下 :

php artisan migrate:fresh    //推回所有遷移並且再執行一次

不過一旦被refresh過,資料庫內被新增過的資料都會被清空。

如果只想要回推上一步,我們可以下這個指令 :

php artisan migrate:rollback

Model 跟 Migration有甚麼差別?

Migration是操作table的結構,Model是操作table內的資料。

Model可以隨時地進行修改新增刪除或抓取資料庫內的資料,但migration是單向的將資料表的結構傳到資料庫。