ano,先繼續Model架構設計的話題。
在小型Project的時候,怎麼寫其實都沒差,反正就那點程式碼。但當Project越來越大的時候,沒有好好規劃整個Project的架構就會很難維護。如果我都不規劃、把所有程式碼都塞一起,今天我要增加一個功能,我還要一行一行翻看看我會動到什麼,想想就頭好痛。
我們其實可以把Model再拆成三個部分:Entity、Repository、Service
Entity可以理解為昨天提到的、定義資料表的部分。它單純定義Eloquent Model的相關設定,就是昨天講到的部分。
Repository是處理資料庫的邏輯部分,就是學資料庫時會用到的增刪改查,與Entity是一對一的關係,一張資料表對應一組使用該資料表的邏輯。
Service顧名思義是服務相關、也就是商業邏輯,介於Controller與Model之間,整個應用相關的邏輯都可以算在這裡,再細分下去。
好了,回到Eloquent。
我們知道怎麼設定Eloquent Model,接著要來看增刪改查。
// 取出所有資料
$allCat = Cat::all();
$allCat = Cat::get();
// 篩選
$allCat = Cat::where('name', '小黑')->get;
直接使用get()
這個函式也可以取出所有資料,相當於all()
,但增加查詢條件時就只能使用get()
,總的來說統一使用get()
會比較好。
$cat = new Cat;
$cat->name = '小白';
$cat->age = '2';
$cat->save();
或是
$cat = new Cat([
'name' => '小白',
'age' => '2'
]);
$cat->save();
兩者結果都會插入資料到資料表中,只是後者是用陣列的方式。而這兩種方式在使用save()
之前都不會把資料存入資料庫。
$cat = Cat::create([
'name' => '小白',
'age' => '2'
]);
直接使用Model::create
則會直接使用create()
方法,就不用再加上save()
。Model::update
也是同理。
最後是刪除,Eloquent除了提供刪除方法還提供了「虛刪除」,也就是「標記是否被刪除」。當我們可能會再把資料還原回來時,用虛刪除可以很快就把「刪掉」的資料還原,但也要注意如果一直使用虛刪除資料庫會越來越大。
$cat = Cat::where('name', '小花')->delete();
這是搭配查詢來刪除叫做「小花」的貓貓資料,如果你知道小花貓貓的編號(主鍵)是「87」,也可以透過Cat::destroy(87)
來刪除小花的貓貓資料。
Schema::table('cats', fuction (Blueprint $table) {
$table -> softDeletes();
});
使用虛刪除前要先在資料表中新增一個欄位,接著:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Cat extends Model
{
use SoftDeletes;
protected $dates = ['delete_at'];
}
這樣便啟用需刪除功能,之後再使用delete()
或destroy()
方法時,就會在這個欄位註記而不是直接刪除。