ORM 是用來代替傳統純 SQL 查詢的工具,好處是能比純 SQL 更簡便、安全的存取資料庫。而我大 Laravel 舊內建了 ORM,接下來就來學 Laravel 的 ORM 去存取資料庫囉!

首先,ORM 的 邏輯基本上都是跟著 SQL語法走,所以常用到的 SQL 語法例如:INSERT、SELECT、UPDATE、DELECT、WHERE、JOIN、ORDER BY、…….,都有對應的函式,所以學過 SQL 的同學肯定也能很快上手。我就從 CRUD 的4個面向來介紹。

CREATE(C)

create 的方法主要有兩種,其中一種是 create 函式,在 seeder 的章節有看到過,他可以新增一筆資料

Store::create([
		'name' => $request->name,
    'address' => $request->address,
    'description' => $request->description,
]);

也可以在前面用一個變數接資料,會得到新增成功後的該筆紀錄,這很常用在新增完後獲取 id 等等自動產生的欄位

$store = Store::create([
		'name' => $request->name,
    'address' =>  $request->address,
    'description' => $request->description,
]);
return respone()->json($store);

第二種是操作物件的方式,可以將每個欄位分別新增,基本上跟 create 方法差不多,並且新增完後也可以立即獲得該筆紀錄,另外 create 方法屬於批量填入,需要在 Model 設定批量分配屬性,不然會發生錯誤

$store = new Store;
$store->name = $request->name;
$store->address = $request->address;
$store->description = $request->description;
$store->save();
return response()->json($store);

另外要注意的是要是在資料庫新增失敗時會直接跳出程式錯誤,所以通常操作資料庫都會加上 try catch 處理錯誤

try {
		$store = new Store;
		$store->name=$request->name;
		$store->address=$request->address;
		$store->description=$request->description;
		$store->save();
		return response()->json([$store], 200);
} catch (\\Exception $e) {
		return response()->json(["message"=>$e->getMessage()], 400);
}

除了上面兩種方法以外,還有很多特別的函式,例如:firstOrCreate、updateOrCreate 之類的,但這裡就不介紹了,需要的可以看官網。

READ(R)

查詢大部分都跟原生 SQL 一樣,看範例:

$store = Store::where("id", "<>", 1)
								->where('name', 'like', 'Ti%da')
								->whereNot('name', 'like', 'Lu%a')
								->orderBy('id')
								->orderByDesc('name')
								->groupBy('name')
								->havingRaw('COUNT(*) > ?', [1])->get()

可以看到很多熟悉的關鍵字吧,查詢的語法與原生 SQL 差不多,但在熟悉的關鍵字中出現了不一樣的東西,讓我們解釋一些常用方法:

where("id", 1) //第一個參數是欄位,第二個參數是用來比對的值
where("id", "<>", 1) //中間可以再插入一個運算子,或是"like"比對字串,預設是"="
whereNot('name', 'like', 'Lu%a') //就是加一個 Not 沒什麼問題吧
orWhere('name', 'like', 'Lu%a') //就是加一個 or,也意味著沒加 or 就是 and
whereBetween('votes', [1, 100]) //between 的用法是第二個位置用陣列
whereNotBetween('votes', [1, 100]) //當然也有 Not 的版本
orderBy('id') // 依填入的欄位正序排序
orderByDesc('name') // 依填入的欄位倒序排序
groupBy('name') // 就是 SQL 的 GROUP BY
havingRaw('COUNT(name) > ?', [1])
// 這個比較特別,雖然也有 having(),但那個方法用不了在 having 最常用的聚合函數,
// 因此使用 havingRaw 會更好,第一個參數就是原生 SQL 語句,
// 第二個參數是可選的,會將陣列中的值依序填入第一個參數中的'?'

最後用 get()first() 才會拿到資料

還有一些不是根據 SQL 邏輯的常用函式

Store::find(1) //找 id 為 1 的資料
Store::with("product") //將 product 中關聯的資料一並輸出,需要在 Model 定義關聯
Store::where("id", 1)->first()->product //印出 product 中與 Store 裡 id=1 有關聯的資料

還有非常多很方便的函式,在這就不多做介紹,可以自行上官網了解。

UPDATE(U)

update 也與 create 一樣主要有兩種方式,但兩個方法有很大差別:

// 這個方法可以一次修改大量符合條件的資料
Store::where("id", "<>", $request->id)->update(["name"=>"aa","address"=>"ffrgg"]);

// 這個方法只能修改一筆資料
$store = Store::where("id", $request->id)->first();
$store->name = $request->name;
$store->save();

當然一樣的還有很多 update 的延伸方法,不過平常也不一定會用到,好奇可以自己去找。

DELETE(D)

刪除也很簡單,主要分為用查詢語句篩選資料,或是簡化過後的指定 id 刪除

// 用查詢語句來刪除
Store::where("id", $request->id)->delete();

// 查 id 刪除,可以放多個參數,也能放一個陣列
Flight::destroy(1, 2, 3);
Flight::destroy([1, 2, 3]);

到此基礎 ORM 也介紹的差不多了,以上方法已經可以解決大部分資料庫處理的問題,但如果有時間的話,也很推薦看看官網,很多函式都很好用,可以說只有你想不到的,沒有 Laravel 做不到的。