---
tags: laravel
---
# 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