laravel笔记-Eloquent ORM(杂项)
写在前面
时间可贵,善用目录↑
学习Laravel的笔记,仅仅是作为laravel文档笔记,目的是强化对文档的理解,质量不高。
什么是杂项
集合、访问器、修改器、序列化
集合
Eloquent 返回的所有的包含多条记录的结果集都是 Illuminate\Database\Eloquent\Collection 对象的实例
就是说Eloquent查询返回的是Collection这个类的实例,它本身支持一些方法,方便我们对查询结果进行操作。
具体方法详见 laravel笔记-集合
访问器&修改器
访问器和修改器允许你在获取模型属性或设置其值时格式化 Eloquent 属性。
访问器
在Eloquent使用getFooAttribute方法创建访问器,Foo表示要访问的字段(驼峰命名)。
本例创建一个sex的访问器。在访问sex字段时访问器会被调用:
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model{
/**
* 设置用户的性别
*
* @param string $value
* @return string
*/
public function getSexAttribute($value)
{
//当访问sex字段时会调用访问器
return $value == 1 ? '男':'女';
}
}
正如你所看到的,该字段的原生值被传递给访问器,然后返回处理过的值。
修改器
相应的修改器,需要在模型中定义setFooAttribute方法。
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model{
/**
* 设置用户的性别
*
* @param string $value
* @return string
*/
public function setSexAttribute($value)
{
$this->attributes['sex'] = $value == 男 ? 1:0;
}
}
日期修改器
默认情况下,Eloquent 将会转化created_at和updated_at列的值为 Carbon 实例,该类继承自 PHP 原生的Datetime类。
当然,我们可以根据自己的需求将需要的字段转化为Carbon。
使用$dates属性。
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model{
/**
* 应该被调整为日期的属性
*
* @var array
*/
protected $dates = ['created_at', 'updated_at', 'disabled_at'];
}
这样disabled_at字段也可以使用一些Carbon的方法:
$user = App\User::find(1);
$user->disabled_at->getTimestamp();
同时如果字段为日期格式,我们也可以通过Carbon来进行方便的取值:
$user = App\User::find(1);
$user->disabled_at = Carbon::now();
$user->save();
如上例,laravel会自动将正确的格式存入数据库。
属性转换
比如说,一个字段在数据库中为了方便保存的是integer类型,但是我们在实际操作的时候需要它是boolean类型。那么就需要属性转换这个操作。
通过$casts实现
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model{
/**
* 应该被转化为原生类型的属性
*
* @var array
*/
protected $casts = [
'is_admin' => 'boolean',
];
}
这样当我们再访问is_admin的时候获得的就是boolean型的数据了。
数组&JSON转换
这里比较重要的就是JSON和数之间的相互转换。
比如说你表中的一个字段储存的是JSON数据,而在进行逻辑操作的时候需要数组。
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model{
/**
* 应该被转化为原生类型的属性
*
* @var array
*/
protected $casts = [
'options' => 'array',
];
}
就是这样。
$user = App\User::find(1);
$options = $user->options;
$options['key'] = 'value';
$user->options = $options;
$user->save();
序列化
前面说过,我们通过Eloquent在数据库中取出的数据是Collection的实例,但是有时候我们需要将这个实例转化为数组或者JSON数据。
这就需要进行序列化操作。
Eloquent提供了方便的序列化操作方法,会自动将Eloquent实例包括关联关系自动转化为响应类型。
$user = App\User::with('roles')->first();
//序列化为数组
$userArray = $user->toArray();
//序列化为JSON
$userJSON = $user->toJson();
隐藏属性
有些时候我们在序列化的时候希望隐藏一些属性,比如密码。
这时就需要$hidden属性。
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model{
/**
* 在数组中隐藏的属性
*
* @var array
*/
protected $hidden = ['password'];
}
当然,有的时候需要暴露一下被隐藏的属性,比如说验证密码。
return $user->makeVisible('attribute')->toArray();
也可以临时隐藏一些属性:
return $user->makeHidden('attribute')->toArray();
追加属性
当然,有时候我们需要追加一些数据库中没有的属性到Eloquent。
可以使用$appends属性和getFooAttribute方法来共同实现。
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model{
/**
* 追加到模型数组表单的访问器
*
* @var array
*/
protected $appends = ['is_admin'];
/**
* 为用户获取管理员标识
*
* @return bool
*/
public function getIsAdminAttribute()
{
return $this->attributes['admin'] == 'yes';
}
}
这样就完成了is_admin属性的追加。