Eloquent 魔術函式

預先處理被異動的欄位資料

在使用 Eloquent 新增或異動資料時,我們可能想要對輸入的資料做預先的處理,我們可以使用 Laravel 提供的魔術函式 setNameAttribute() 去預先處理欄位資料。

如果我們要預先處理文章模型(Article)的發布時間欄位(published_at),我們的魔術函式就會是像:

class Article extends Model {

    public function setPublishedAtAttribute($date) {
        // 將傳入的 Y-m-d 時間設為 datetime 格式的現在時間
        $this->attributes['published_at'] = Carbon::createFromFormat('Y-m-d', $date);

        // 將傳入的 Y-m-d 時間設為 datetime 格式的凌晨零時 00:00:00
        $this->attributes['published_at'] = Carbon::parse($date);
    }
}

魔術函式 setNameAttribute() 中,若遇到欄位名稱有底線的狀況,則將名稱設為駝峰式大小寫(Camel-Case),像是 published_at 則變成 PublishedAt

自定義 query 處理函式

假如我們要讀取發表的文章,但是發表的時間 published_at 必須過去的時間,設定於未來發表時間的文章不能被撈取出來,我們可以用這樣的方式去撈取:

// 取得已經發表的文章,依照發表時間降冪(Desc)排序
$article = \App\Article::latest('published_at')
    ->where('published_at', '<=', Carbon::now())
    ->get();

我們可以簡化這個 query,把它寫在 Model 用函式的方式做處理,這樣我們就可以用這樣去取得已發表的文章:

// 取得已經發表的文章,依照發表時間降冪(Desc)排序
$article = \App\Article::latest('published_at')
    ->published()
    ->get();

而 Model 裡面我們用 scopeName 魔術函式的方式去設定 published()

class Article extends Model {

    public function scopePublished($query) {
        $query->where('published_at', '<=', Carbon::now());
    }

}

若我們想要取得尚未被發表的文章資訊,我們模式函式也可以設定成:

class Article extends Model {

    public function scopeUnpublished($query) {
        $query->where('published_at', '>', Carbon::now());
    }

}

這樣我們就可以用 unpublished() 去設定取得文章資訊了

// 取得已經發表的文章,依照發表時間降冪(Desc)排序
$article = \App\Article::latest('published_at')
    ->unpublished()
    ->get();

這樣的優點是:

  1. 簡化程式的長度
  2. 讓我們在不同的地方不需要寫同樣落落長的查詢
  3. 讓查詢的可讀性增加,published()unpublish() 我們不需要看查詢的語法條件就可以知道這個地方是要做什麼樣的查詢了

參考資料

KeJyun 最新新書推薦
Laravel 5 for beginner 新手道場:優雅運用框架快速開發 PHP 網站
Laravel框架开发详解:从零基础到运用框架快速开发PHP网站

Laravel 是 PHP 的框架(Framework),提供了很多開發網站或 API 所需的工具及環境,經過簡單的設定就可以完成資料的處理及顯示,使開發者可以很優雅且快速的開發出各個不同的產品。本書適合有 PHP 基礎的人,但不知道要怎麼選擇框架,或者不用框架的人也能夠明白它的好處。

雖然 WordPress 也能夠架站,但如果有客製化需求,要開發各式各樣的網站,或提供 App 使用的 API,如此一來你只能選擇用框架,而 Laravel 是目前最受歡迎的。

本書將解說為什麼要使用框架,以及理解框架的優缺點後,要怎麼選擇框架,並用框架快速建構一個網站。除非必要,否則書中會避免專業技術用語,盡量使用最生活化易懂的例子及語氣,讓大家更容易進入 Laravel 的世界。

購書連結

購書連結

results matching ""

    No results matching ""