甚麼是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
& down
。up
方法被用於新增新資料表、欄位、或索引到你的資料庫,而 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是單向的將資料表的結構傳到資料庫。