在介紹了FamilyBoard的內容後,我們要開始介紹其中一些不可或缺的背景知識,就是Eloquent ORM的使用,我們使用的是MySQL資料庫,通常使用這種關聯式資料庫會需要使用SQL語法,但Laravel提供了Eloquent ORM讓使用者可以不需要直接寫SQL語法,也能跟資料庫互動,因此我們接下來要介紹Eloquent的操作。
Eloquent是以Model為操作基準,每個資料表有一個相對應的Model,利用Model去跟資料庫互動來查詢或插入資料等CRUD操作,同時也在Model中表示跟其他Model間的關係,因此:
一. Eloquent ORM系列一:單一Model的操作。
二. Eloquent ORM系列二:Model與Model關係的操作。
三. Eloquent ORM系列三:其他跟Eloquent有關的操作。
我同時把這個系列當成自己把文件看過一遍的機會,所以這些系列會跟官方文件相參照。
-
命令列指令:
Laravel提供了簡單的命令列指令去產生Model,例如: php artisan make:model Project,此外可以帶入其餘的參數如-r/-m等去產生相對應的資料表與Controller,這些參數可以參考:php artisan help make:model
-
如何設定Model與資料表等其他部分的對應關係:
通常Laravel會有許多預設值,例如Model所對應資料表的關係預設為Model的複數,但如果你的設定不符合這些預設值時,就必須在Model中自己設定,Model為Project例子如下:
對應 |
預設值 |
可設定 |
資料表 |
projects |
protected $table = 'my_projects' |
資料表的主鍵名稱 |
id |
protected $primaryKey = 'project_id' |
資料表的主鍵增加 |
型態:int; 自動增加 |
型態非int或不自動增加時:public $incrementing = false |
資料表的主鍵型態 |
型態:int |
型態非int:protected $keyType = 'string' |
資料表的資料創造與更新時間 |
由Eloquent自動管理 |
public $timestamps = false |
- 如何從Model中取資料
Laravel提供了很多方式讓使用者限定想要取得的資料,包含:
- Model作為query builder時,由於query builder包含了許多常用的SQL語法,利用這些語法就可以跟資料庫取得限定的資料。
- Model利用all()或get()取得多筆回傳的資料時,這些回傳資料為Illuminate\Database\Eloquent\Collection的實體,可以利用Collection提供的方法去取得限定的資料。
- CRUD操作的整理
Laravel除了提供基礎的CRUD操作外,還提供很多實用的操作,例如可以根據該筆資料有沒有存在於資料庫而決定更新或新增資料等,因此省下寫很多判斷式的心力。
語法整理如下:
ps. 因為Laravel 8將Model都收納到Models的資料夾中,所以使用Laravel 8的Model時,namespace會從App變成App\Models。
語法 |
firstOr |
使用場景 |
會回傳第一筆符合的資料,如果沒有資料,則會執行callback函式,回傳函式中的結果。 |
寫法 |
$user = App\User::where('id','>',100)->firstOr(function(){return ...;}); |
語法 |
findOrFail |
使用場景 |
會回傳第一筆符合的資料,如果沒有資料,會回傳ModelNotFoundException。 |
寫法 |
Route::get('/api/projects/{id}', function ($id) {return App\Project::findOrFail($id); }); |
特點 |
前端向後端透過Api要資料時,沒有資料的情況下,該例外如果沒有被捕捉到時,會自動回傳404。 |
語法 |
firstOrCreate |
使用場景 |
會回傳第一筆符合的資料(name'=>'jhao'),如果沒有資料,會在資料庫創建資料,並回傳該資料的Model實體。 |
寫法 |
$user = App\User::firstOrCreate(['name'=>'jhao'],['email'=>'jhao@gmail,'password'=>Hash::make('jhao’secret')]); |
語法 |
firstOrNew |
使用場景 |
會回傳第一筆符合的資料(name'=>'jhao'),如果沒有資料,會回傳該資料的Model實體,但是並不會主動在資料庫創建資料,需要手動save()。 |
寫法 |
$user = App\User::firstOrNew(['name'=>'jhao'],['email'=>'jhao@gmail,'password'=>Hash::make('jhao’secret')]); $user->save(); |
語法 |
updateOrCreate |
使用場景 |
會更新第一筆符合的資料(name'=>'jhao'),如果沒有資料,會在資料庫創建資料,並回傳該資料的Model實體。 |
寫法 |
$user = App\User::updateOrCreate(['name'=>'jhao'],['email'=>'jhao2@gmail,'password'=>Hash::make('jhao’secret')]); |
參考文件:
Eloquent: Getting Started;
laravel firstOrNew, firstOrCreate, firstOr, and updateOrCreate methods