Laravel 中的 Accessor/Mutators 和 Casting 有什么區別?
<?php
...
class User extends Model
{
public function getIsAdminAttribute($value){
return (bool)$value;
}
public function setIsAdminAttribute($value){
$this->attributes['is_admin'] = (bool)$value;
}
}
..
<?php
...
class User extends Model
{
protected $casts = [
'is_admin' => 'boolean',
];
}
我覺得他們都在做同樣的事情,那么有什么區別呢?
uj5u.com熱心網友回復:
訪問器在訪問時轉換 Eloquent 屬性值。
public function getFirstNameAttribute($value)
{
return strtoupper($value);
}
每當您獲取模型時,該屬性將根據訪問器定義進行格式化/回傳。讓我們假設用戶的 first_name 是John。上面的訪問器將回傳first_name大寫:
$user = User::findOrFail($id);
dd($user->first_name); // Will return 'JOHN' instead of 'John' because accessor
相反,mutator 將在存盤到您的資料庫之前處理該屬性
public function setFirstNameAttribute($value)
{
$this->attributes['first_name'] = strtoupper($value);
}
每當您保存模型時,該屬性將按照 mutator 定義進行格式化。假設您將用戶的 first_name 作為John. 上面的 mutator 將first_name像JOHN之前一樣轉換存盤:
$user = new User();
$user->first_name = 'John'; // It will be stored as JOHN because mutator
$user->save();
屬性轉換提供類似于訪問器和修改器的功能。主要目的是使用預定義的鑄造方法,而不是手動定義您自己的鑄造方法。IE,從屬性創建日期 Carbon 實體:
protected $casts = [
'birthday' => 'date',
];
代替
public function getBirthdayAttribute($value)
{
return Carbon::create($value);
}
public function setBirthdayAttribute($value)
{
$this->attributes['birthday'] = Carbon::create($value);
}
您可以在https://laravel.com/docs/8.x/eloquent-mutators#attribute-casting查看檔案
uj5u.com熱心網友回復:
除了 Luciano 所寫的之外,訪問器和修改器可以做一些強制轉換不能做的事情。在下面的示例中,我們定義了一個is_birthday屬性。
/**
* @property Carbon date_of_birth
* @property-read boolean is_birthday
*/
class Person extends Model {
public function getIsBirthdayAttribute(){
return $this->attributes['date_of_birth']->isToday();
}
}
這些派生屬性對于抽象出常見的訪問模式非常有幫助,例如從名字和姓氏中獲取全名或計算發票(子)總計。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/392927.html
標籤:拉拉维尔
上一篇:訪問另一個模型上的關系
下一篇:我似乎在上傳圖片時遇到問題。我不斷收到“無法將App\Http\Controllers\PostsController型別的物件用作陣列。”
