文章轉發在專業的 Laravel 開發者社區,原始連接: https://learnku.com/laravel/t...
當我第一次開始在 Laravel 開發時,我感受在實現模型時有不少事情能夠採用更好的方式來完成。在探索 Eloquent 模型類以後,我發現你能夠用你的模型作一些有趣的事兒,這會讓你感受更加的輕鬆。php
在這篇文章中,我會向你提供7個小提示,讓每個使用 Laravel 的人都知道應該如何充分利用你的模型。laravel
當咱們經過命令行建立一個模型時,你能夠指定在某個文件夾中建立這個模型。你所要作的就是在模型名稱前輸入你的文件夾的名稱。當你的模型沒有存儲在默認的 app 文件夾中時,這對你頗有幫助。數據庫
php artisan make:model Models/Product
此時將會在 app/Models 文件夾中建立一個 Product 模型,這樣能夠節省你將模型移動到符合條件的的文件夾的時間。數組
$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
某些屬性並不該該被包含在模型的數組或JSON表示中,例如 密碼 屬性。此時即是 $hidden 屬性登場的時候了。
protected $hidden = [ 'password' ];
$hidden* 屬性就像是屬性的黑名單。或者,你也可使用 *$visible 屬性來設置屬性的白名單。
protected $visible = [ 'first_name', 'last_name' ];
當在模型中設置了 $visible* 屬性時,其餘的屬性將會自動隱藏。這個方式就像 *$fillable 和 $guarded 屬性同樣。
有些時候你想要將多個屬性合併爲一個屬性,或者你僅僅想要格式化屬性。此時咱們可使用 Laravel 的訪問器。
假設你有一個 User 模型,而且它們具備 first_name 和 last_name 屬性。若是你想要展現全名的話,你能夠這麼作:
$this->first_name . ' ' . $this->last_name
這是一個很是天真的作法。在 Laravel 中解決這個問題的方法是使用訪問器。訪問器會使用如下語法在模型中定義一個方法:
get[NameOfAttribute]Attribute
一個獲取全名的訪問會是下面這個樣子:
public function getFullNameAttribute() { return "{$this->first_name} {$this->last_name}"; }
要獲取全名的值,你只須要像這樣調用訪問器便可:
$user->full_name
修改器 容許您對值進行操做,並在模型的 *$attributes* 屬性上設置操做值。變量具備與訪問器相同的語法。
public function setLastNameAttribute($value) { $this->attributes['last_name'] = ucfirst($value); }
這個mutator將對姓氏應用*ucfirst *函數,並將結果存儲在*$attributes*屬性中。
$user->last_name = 'jones'; // 結果將會是 `Jones`
當模型具備訪問器和模型關聯時,默認狀況下它們不會被添加到模型的數組或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 中的 id 和 title 添加到模型中。
$appends = [ 'full_name', 'blogs:id,title' ];
當一個模型與與另外一個模型存在 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 屬性。