Laravel Eloquent(Model)的几种妙用

Laravel 的Eloquent提供了非常强大的 功能

其中包括 getter setter 魔术方法

可以利用这两个方法实现一些妙用

1、虚拟属性

用户资料表中,通常会以int存储性别,例如:gender字段1-男,2-女,3-未知

在客户端(App或者网页)中,会需要显示中文文字或者其他语言的文字,在每个输出的地方重复一下代码不合适,在UserProfileModel类里面可以使用虚拟属性。

const GENDERS = [1=>'男', 2=>'女', 3=>'未知'];

public function getGenderTextAttribute()
{
     return static::GENDERS[$this->gender] ?? '';
}

通过访问$model->gender_text 或者 $model->genderText 这两个属性,会隐式调用方法getGenderTextAttribute()。

$model->toArray()方法会将数据库所有字段变为数组(对象数组),默认情况下,不会调用getGenderTextAttribute()方法,可以使用Model内置的$appends 来将genderText在toArray()时候一起输出。

protected $appends = [...,  "genderText"]

定义方法名时,建议不要覆盖现有的字段名字,业务代码可能需要原始值做逻辑判断

2、数据自动序列化

在MySQL中,并没有一种直白的类型,能够保存多变PHP数组或者PHP对象,通常情况下,都是进行json化或者序列化,下面介绍一下全自动序列化过程:

// UserProfileModel.php  数据库字段extra 为 varchar(255)
public function getExtraAttribute()
{
    return json_decode($this->attributes['extra'] ?? '[]', true);
}

public function setExtraAttribute($v)
{
    $this->attributes['extra'] = json_encode($v);
}
// 业务中使用方法
$model->extra = ["乱七八糟的数组" : ["abc" : "adfasdf"]];
$model->save();
var_dump($model->extra);
// 输出一个数组

未完待续…

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

在此处输入验证码 : *

Reload Image