2019鐵人賽 Laravel database eloquent collection前兩天跟大家介紹過了 Laravel 如何簡化資料庫連線、sql 查訪方法,今天在跟大家介紹更進階的使用方式 - Eloquent ORM
ORM(英文:Object Relational Mapping):
物件導向是從軟體工程基本原則(如耦合、聚合、封裝)的基礎上發展起來的,而關聯式資料庫則是從數學理論發展而來的,兩套理論存在顯著的區別。為了解決這個不符合的現象,物件關聯對映技術應運而生。
講白話一點就是 Laravel 自己透過物件導向的概念設計了一套可以對映到 SQL 語言的資料庫操作方式,而這套系統,就稱為 Eloquent 。
Eloquent ORM 提供了簡單、漂亮的語法來和資料庫互動。而實際做法就是每個資料表都對應著一個 Model 來和資料表互動。
我們可以透過 Artisan 指令快速建立 Model
php artisan make:model Flight
//Flight 為 Model 名稱
透過 Artisan 指令可以生成一個最基本的 Model 如下:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
    //
}
從上述程式碼可以得知,新創立的「模型」:
App 資料夾下Illuminate\Database\Eloquent\Model
Eloquent 本身會默認先找一個與「模型」名稱一樣,但是是小寫、底線、複數形式的名詞來當作資料表名稱。
For Example:
| Class Name | Default Table Name | 
|---|---|
| Flight | flight | 
| User | user | 
| MyTable | my_tables | 
當然你也可以直接在「模型」裡用 $table 屬性設定資料表名稱
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
    protected $table = 'my_flights';
    // 自定義資料表名稱為 'my_flights'
}
Eloquent 也會假設每個資料表有一個遞增的整數值主鍵欄位叫做 id。你可以定義一個 $primaryKey 屬性來重新定義。
此外,如果你的主鍵非遞增方式,請務必把 public $incrementing 屬性設定為 false。如果非整數值,則請把 protected $keyType 屬性設定為 string。
Eloquent 預設你的資料表會有 created_at 和 updated_at 來記錄資料寫入和更新資料表的時間,如果不需要這些設定,可以把 public $timestamps 屬性設定為 false。
也可以透過 protected $dataFormat 來變更日期儲存格式,以及輸出成陣列或 JSON 時的格式。
除此之外,你也可以自定義 CREATED_AT 和 UPDATED_AT 常數來決定資料表中的欄位名稱。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
    /**
     * 模型的日期欄位儲存格式。
     *
     * @var string
     */
    protected $dateFormat = 'U';
    
    //自定義 資料寫入和更新資料表 的欄位名稱
        const CREATED_AT = 'creation_date';
    const UPDATED_AT = 'last_update';
}
基本上資料庫連線會先依照 config\database.php 的設定,但你也可以透過 $connection 屬性為 Eloquent 指定不同連線。
以上都是 Eloquent 常用的預設屬性,其他還有「白名單」、「黑名單」、「隱藏」...等屬性,我想官方文件介紹都很清楚,我這不一一介紹。
Eloquent 回傳的負數資料結果,都會是 Illuminate\Database\Eloquent\Collection 的實例,這跟昨天講到「查詢建構器」的方法 get() 一樣。
collection ?集合物件繼承 Laravel collections,所以它自然也繼承了幾十種用於與底層 Eloquent  模型陣列的優雅方法。
集合相比陣列強大許多,除了提供 map、sort 或 reduce 等各種遍歷集合的方法外,最大的好處就是可以透過「鏈結語法」的直觀操作。
ForExample:
假設 users 表中有一個欄位 is_online 記錄了目前使用者在線上,我們可以透過 reject()、map() 的方式找出目前在線上的使用者姓名。
$name = App\Flight::all()
        ->reject(function ($user) {
                return $user->is_online === 0;
            })
        ->map( function ($user) {
                return $user->name;
            });