iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 28
0
Software Development

新手後端工程師的學習歷程系列 第 28

Day 28 - Laravel Database 篇 part III

tags: 2019鐵人賽 Laravel database eloquent collection

前言

前兩天跟大家介紹過了 Laravel 如何簡化資料庫連線、sql 查訪方法,今天在跟大家介紹更進階的使用方式 - Eloquent ORM

ORM(英文:Object Relational Mapping):
物件導向是從軟體工程基本原則(如耦合、聚合、封裝)的基礎上發展起來的,而關聯式資料庫則是從數學理論發展而來的,兩套理論存在顯著的區別。為了解決這個不符合的現象,物件關聯對映技術應運而生。
講白話一點就是 Laravel 自己透過物件導向的概念設計了一套可以對映到 SQL 語言的資料庫操作方式,而這套系統,就稱為 Eloquent 。

Eloquent ORM

簡介

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

預設條件

1. 資料表名稱

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'
}

2. 主鍵

Eloquent 也會假設每個資料表有一個遞增的整數值主鍵欄位叫做 id。你可以定義一個 $primaryKey 屬性來重新定義。

此外,如果你的主鍵非遞增方式,請務必把 public $incrementing 屬性設定為 false。如果非整數值,則請把 protected $keyType 屬性設定為 string

3. 時間戳記

Eloquent 預設你的資料表會有 created_atupdated_at 來記錄資料寫入和更新資料表的時間,如果不需要這些設定,可以把 public $timestamps 屬性設定為 false

也可以透過 protected $dataFormat 來變更日期儲存格式,以及輸出成陣列或 JSON 時的格式。

除此之外,你也可以自定義 CREATED_ATUPDATED_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';
}

4. 資料庫連線

基本上資料庫連線會先依照 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;
            });

上一篇
Day 27 - Laravel Database 篇 part II
下一篇
Day 29 - Laravel Authentication - Hasher 篇
系列文
新手後端工程師的學習歷程30

尚未有邦友留言

立即登入留言