Eloquent CRUD

Restful

為一種純粹使用URL網址來傳遞資訊的機制,比如/photos/1/edit

Resource Restful 路由規則

生成路由規則的寫法

//routes/web.php
Route::resource('photos','App/Http/Controllers/PhotoController');

生成對應路由規則的控制器與方法

php artisan make:controller PhotoController --resource

新增資料

//使用Item物件的屬性來新增
$item = new Item;
$item->title = '手機一台';
$item->price = '15000';
$item->pic = 'https://member.ithome.com.tw/avatars/88232?s=ithelp';
$item->enabled = 1;
$item->size = 'L';
$item->email = 'admin@demo.com';
$item->save();

//使用Item建構子來新增
$item = new Item([
    'title' => '手機2台',
    'price' => '15000',
    'pic' => 'https://member.ithome.com.tw/avatars/88232?s=ithelp',
    'enabled' => 1,
    'size' => 'L',
    'email' => 'admin222@demo.com'
]);
$item->save();

//使用Item的create()來新增
$data = [
    'title' => '手機4台',
    'price' => '15000',
    'pic' => 'https://member.ithome.com.tw/avatars/88232?s=ithelp',
    'enabled' => 1,
    'size' => 'L',
    'email' => 'admin444@demo.com'
];

$item = Item::create($data);//要注意Mass Assignment保護機制

Mass Assignment

當鍵入資料是以陣列的方式,而且是使用模型的create()的話,通常都會觸發Mass Assignment防護機制,預設所有的欄位都會被保護

如要關閉欄位的保護,進到Model檔案內,如App\Models\Item.php,加入以下屬性

protected $fillable = ['白名單欄位名'];
protected $guarded = ['黑名單欄位名'];

查詢資料

單筆資料

//用流水號進行查詢,找不到就算了
$item = Item::find($id);

//用流水號進行查詢,找不到會報錯
$item = Item::findOrFail($id);

//查詢有啟用的商品,取出第一個
$item = Item::where('enabled',true)->first();

多筆資料

//取得items表格的所有資料
$items = Item::get();

//取得items表格的所有資料,並依created_at欄位由大至小排序
$items = Item::orderBy('created_at','desc')->get();
        
//取得items表格的所有enabled欄位為true的資料
$items = Item::where('enabled',true)->get();

修改資料

得到資料參考後,設定欄位新屬性值,最後呼叫save()更新永續層(資料庫)

第一種作法
$item = Item::find($id);
$item->price = 0;
$item->save();

第二種作法
$song = Song::updateOrCreate(['id'=>$song->id],['name'=>'Song99']);

刪除資料

//使用資料參考來刪除
$item->delete();

//使用主鍵來刪除
Item::destroy($item->id);

Route Model Binding

為你省去下達find(),用主鍵找資料的步驟

Step 1.將路徑參數改為Model名稱

//routes/web.php

Route::get('/itemdelete/{item}','App\Http\Controllers\ItemController@destroy');

Step 2.變更Action的參數列,補上模型類別與名稱

//app/Http/Controllers/ItemController.php

public function destroy(Item $item)

Step 3.為模型類別加入白/黑名單

//app/Models/Item.php

//設定黑名單為空
protected $guarded = [];

//設定白名單欄位
protected $fillable = ['title','price'...];

常見問題

Q1.如何判斷查詢完所給的變數是集合還是物件?

A.問自己所使用的查詢方法有無可能拿到多筆資料,只要有可能,一定是集合,比如all().get()屬之,否則則必然為物件

補充資料

用Token取代Git帳密的做法

https://你的帳號:你的TOKEN@github.com/javck/voyage.git

關於Restful的說明

https://progressbar.tw/posts/53

Select a repo