七個必知必會的 Laravel Model 小知識

文章轉發在專業的 Laravel 開發者社區,原始連接: https://learnku.com/laravel/t...

當我第一次開始在 Laravel 開發時,我感受在實現模型時有不少事情能夠採用更好的方式來完成。在探索 Eloquent 模型類以後,我發現你能夠用你的模型作一些有趣的事兒,這會讓你感受更加的輕鬆。php

在這篇文章中,我會向你提供7個小提示,讓每個使用 Laravel 的人都知道應該如何充分利用你的模型。laravel

1 首先,讓咱們建立模型開始

當咱們經過命令行建立一個模型時,你能夠指定在某個文件夾中建立這個模型。你所要作的就是在模型名稱前輸入你的文件夾的名稱。當你的模型沒有存儲在默認的 app 文件夾中時,這對你頗有幫助。數據庫

php artisan make:model Models/Product

此時將會在 app/Models 文件夾中建立一個 Product 模型,這樣能夠節省你將模型移動到符合條件的的文件夾的時間。數組

2 轉換屬性類型

$casts 屬性提供了將屬性強制轉換爲某些數據類型的方法。app

protected $casts = [
    'is_published' => 'boolean'
];

is_publish 屬性如今將在你訪問的時候強制轉換爲 boolean 類型,即便它在你的數據庫中存儲的是 integer 。也有不少的方式將屬性轉換爲其餘的類型,例如 date 和 datetime函數

我常常會看到一個錯誤的行爲,就是在 Blade 模版文件中將 date 和 datetime 進行格式化,就像這樣: this

{{ $blog->created_at->format('Y-m-d') }}

在某些 Blade 模板文件中,你將會看到在同一個變量上進行屢次的格式化。這個問題能夠經過 $casts 屬性來更高效的解決。spa

對於 date 和 datetime 的轉換屬性,你能夠指定一下格式:命令行

protected $casts = [
    'published_at' => 'datetime:Y-m-d',
];

這將始終會以 Y-m-d 的格式返回 published_at 屬性,因此你再也不須要在 Blade 模板文件中進行任何的格式化了。code

3 是否可見

某些屬性並不該該被包含在模型的數組或JSON表示中,例如 密碼 屬性。此時即是 $hidden 屬性登場的時候了。

protected $hidden = [
    'password'
];

$hidden* 屬性就像是屬性的黑名單。或者,你也可使用 *$visible 屬性來設置屬性的白名單。

protected $visible = [
    'first_name',
    'last_name'
];

當在模型中設置了 $visible* 屬性時,其餘的屬性將會自動隱藏。這個方式就像 *$fillable 和 $guarded 屬性同樣。

4 訪問器

有些時候你想要將多個屬性合併爲一個屬性,或者你僅僅想要格式化屬性。此時咱們可使用 Laravel 的訪問器。

假設你有一個 User 模型,而且它們具備 first_namelast_name 屬性。若是你想要展現全名的話,你能夠這麼作:

$this->first_name . ' ' . $this->last_name

這是一個很是天真的作法。在 Laravel 中解決這個問題的方法是使用訪問器。訪問器會使用如下語法在模型中定義一個方法:

get[NameOfAttribute]Attribute

一個獲取全名的訪問會是下面這個樣子:

public function getFullNameAttribute() {
    return "{$this->first_name} {$this->last_name}";
}

要獲取全名的值,你只須要像這樣調用訪問器便可:

$user->full_name

5 修改器

修改器 容許您對值進行操做,並在模型的 *$attributes* 屬性上設置操做值。變量具備與訪問器相同的語法。

public function setLastNameAttribute($value) {
    $this->attributes['last_name'] = ucfirst($value);
}

這個mutator將對姓氏應用*ucfirst *函數,並將結果存儲在*$attributes*屬性中。

$user->last_name = 'jones'; // 結果將會是 `Jones`

6 追加值

當模型具備訪問器和模型關聯時,默認狀況下它們不會被添加到模型的數組或JSON表示中。爲此,你須要將訪問器或模型關聯添加到模型的 $appends 屬性中。如今讓咱們繼續使用 getFullNameAttribute 訪問器的這個例子:

$appends = [
    'full_name'
];
注意:
添加到 $appends 屬性的訪問器是以蛇形命名法引用,即使訪問器是以駝峯命名法定義的。

讓咱們假設 User 模型與 Blog 模型存在一對多的關係。

public function blogs() {
    return $this->hasMany(App\Blog::class);
}

要將 blogs 添加到模型中,你只須要將他們添加到 $appends 屬性中便可:

$appends = [
    'full_name',
    'blogs'
];

固然,咱們以能夠指定添加的屬性。例如,若是你僅僅須要 blog 中的 idtitle 添加到模型中。

$appends = [
    'full_name',
    'blogs:id,title'
];

7 最後潤色

當一個模型與與另外一個模型存在 BelongsTo 或 BelongsToMany 關聯模型的關係時,好比說 Comment 屬於 Blog,在某些狀況下能夠有助於在更新子項數據時同時更新父級的時間戳。這個問題能夠經過將關係添加到 $touches 屬性中來實現。

class Comment extends Model
{
    protected $touches = ['blog'];

    public function blog()
    {
        return $this->belongsTo(App\Blog::class);
    }
}

當 Comment 模型更新時,同時也會更新 Blog 模型的 updated_at 屬性。

相關文章
相關標籤/搜索