Laravel之Eloquent ORM訪問器調整器及屬性轉換


一.查詢構建器的get方法
查詢構建器的get方法返回了一個集合

$users = App\User::where('active', 1)->get();
foreach ($users as $user) {
	echo $user->name;
}

二.訪問器&調整器
1.訪問器:為數據庫的某列在用屬性讀取的時候做處理
class User extends Model{
	/**
	* 獲取用戶的名字
	*
	* @param string $value
	* @return string
	*/
	public function getFirstNameAttribute($value)
	{
		return ucfirst($value);
	}
}

調用
$user = App\User::find(1);
$firstName = $user->first_name;

2.調整器:為數據庫的某一列在更新的時候做處理
class User extends Model{
	/**
	* 設置用戶的名字
	*
	* @param string $value
	* @return string
	*/
	public function setFirstNameAttribute($value)
	{
		$this->attributes['first_name'] = strtolower($value);
	}
}

$user = App\User::find(1);
$user->first_name = 'Sally';

3.日期調整器
class User extends Model{
	/**
	* 應該被調整為日期的屬性
	*
	* @var array
	*/
	protected $dates = ['created_at', 'updated_at', 'disabled_at'];
...
}


如果字段是日期格式時,你可以將其值設置為 UNIX 時間戳,日期字符串( Y-m-d ),日期-時間字符串, Datetime/Carbon 實例,日期的值將會自動以正確格式存儲到數據庫中:

$user = App\User::find(1);
$user->disabled_at = Carbon::now();
$user->save();


正如上面提到的,當獲取被羅列在$dates 數組中的屬性時,它們會被自動轉化為Carbon 實例,允許你在屬性上使用任何Carbon 的方法:
$user = App\User::find(1);
return $user->disabled_at->getTimestamp();

如果你需要自定義時間戳格式,在模型中設置$dateFormat 屬性,該屬性決定日期屬性將以何種格式存儲在數據庫中、以及序列化為數組或 JSON 時的格式

class Flight extends Model{
	/**
	* 模型日期的存儲格式
	*
	* @var string
	*/
	protected $dateFormat = 'U';
}

三.屬性轉換

1.在訪問時將某列轉為另一種類型:
class User extends Model{
	/**
	* 應該被轉化為原生類型的屬性
	*
	* @var array
	*/
	protected $casts = [
		'is_admin' => 'boolean', //訪問is_admin字段的值時,將其轉為boolean值
	];
}

2.數組轉換
array 類型轉換在處理被存儲為序列化 JSON 的字段是特別有用,例如,如果數據庫有一個 TEXT 字段類型包含了序列化 JSON,添加array 類型轉換到該屬性將會在 Eloquent 模型中訪問其值時自動將其反序列化為 PHP數組:

class User extends Model{
	/**
	* 應該被轉化為原生類型的屬性
	*
	* @var array
	*/
	protected $casts = [
		'options' => 'array',
	];
}

array 類型轉換在處理被存儲為序列化 JSON 的字段是特別有用,例如,如果數據庫有一個 TEXT 字段類型包含
了序列化 JSON,添加array 類型轉換到該屬性將會在 Eloquent 模型中訪問其值時自動將其反序列化為 PHP
數組:

$user = App\User::find(1);
$options = $user->options;
$options['key'] = 'value';
$user->options = $options;
$user->save();

五.序列化

1.轉化模型/集合為數組
$user = App\User::with('roles')->first();
return $user->toArray();

$users = App\User::all();
return $users->toArray();

2.轉化模型為 JSON
$user = App\User::find(1);
return $user->toJson();


3.轉為字符串
$user = App\User::find(1);
return (string) $user;

轉換后的格式如下:
{"id":1,"user_id":1,"name":"\u6700\u65b0\u6d4b\u8bd5","created_at":"2017-05-28 18:44:37","updated_at":"2017-05-31 23:37:55"}

4.隱藏屬性顯示
class User extends Model{
	/**
	* 在數組中隱藏的屬性
	*
	* @var array
	*/
	protected $hidden = ['password'];
}

5.顯示屬性
class User extends Model{
	/**
	* 在數組中顯示的屬性
	*
	* @var array
	*/
	protected $visible = ['first_name', 'last_name'];
}

6.追加值到數組
class User extends Model{
	/**
	* 為用戶獲取管理員標識
	*
	* @return bool
	*/
	public function getIsAdminAttribute()
	{
		return $this->attributes['admin'] == 'yes';
	}
}

這將在原有的列上添加一列is_admin,這需要通過屬性訪問時才會獲得,如果我們希望在獲得數據的時候被一起返回,則還需要append屬性
class User extends Model{
	protected $appends = ['is_admin'];
	/**
	* 為用戶獲取管理員標識
	*
	* @return bool
	*/
	public function getIsAdminAttribute()
	{
		return $this->attributes['admin'] == 'yes';
	}
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM