--- tags: laravel --- # Eloquent ORM 快速指南 ![](https://i.imgur.com/XdzoHHz.png) ## 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); } ```