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;
});