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';
	}
}

  

posted @ 2017-06-01 19:28  rorshach  阅读(4591)  评论(0编辑  收藏  举报