---
tags: laravel
---
# Eloquent ORM 快速指南

## DB Facade vs Eloquent
當要進行複雜的原生SQL語法查詢才建議你使用 DB Facade,否則一般狀況下還是使用 Eloquent 來進行查詢為好
DB Facade 查詢完得到的會是陣列,而 Eloquent 查詢完得到的則是 Eloquent 物件
如果需要把資料陣列轉換成 Eloquent 是做得到的,透過 Query Builder 的 hydrate(),請看以下範例:
```
$userData = DB::select('SELECT * FROM users WHERE id > ?', [$userId]);
$userModels = User::hydrate($userData);
```
## Active Record Pattern
任何技術宣稱有實作Active Record,須具備以下三個特性
* 提供與資料表互動的能力
* 可代表某一筆資料列
* 可自我進行持久保存
## Eloquent
* 有實作Active Record,是一種ORM
>ORM為Object Relationship Management,即用物件關聯的方式來管理資料庫
* 透過定義模型的方式,讓你輕鬆管理資料庫
* 一般每一個模型都指向一個表格
## 命名慣例
### 資料表格名稱
* 包含多筆資料
* 首字母小寫
* 複數型
* Ex:users
### 模型名稱
* 代表一筆資料
* 首字母大寫
* 單數型
* Ex:User
> 不按照命名慣例就要做更多的設定做為代價
## 生成模型
生成Model 類別
php artisan make:model Task
生成Model 類別,連帶生成對應的Migration檔案
php artisan make:model Task -m
## Model進階屬性
#### 指定該模型要對應的表格名稱,如果沒按照命名慣例才需要提供
protected $table = '新表格名稱';
#### 將自定義的timestamps欄位自動轉換成Carbon型態
protected $dates = ['sell_at'];
#### 指定表格的自定義主鍵欄位名稱
protected $primaryKey = 'user_id';
#### 關閉主鍵的自增功能
protected $incrmenting = false;
#### 呈上一個,如果主鍵不是int,就需要指定類型,比如字串
protected $keyType = 'string';
#### 關閉created_at和updated_at的自動維護
protected $timestamps = false;
#### 設定date型態的欄位被存進資料庫時的格式
protected $dateFormat = 'U';
#### 修改預設的時間戳記欄位名稱
const CREATED_AT = 'creation_date';
const UPDATED_AT = 'last_update';
#### 此模型需要連到其他的資料庫
protected $connection = 'connection-name';
## 測試範例
```
//routes/web.php
Route::get('/tasks','SiteController@showTasks');
//App\Http\Controllers\SiteController
public function showTasks(){
return response()->json(Task::get())->setEncodingOptions(JSON_UNESCAPED_UNICODE);
}
```