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