protected $appends
是 Laravel 模型中的一个属性,用于指定哪些虚拟属性(Accessor)应该被包含在模型的数组或JSON表示中。
虚拟属性是在模型中定义的,通过使用 Accessors 和 Mutators 来访问和修改模型属性的值。这些虚拟属性不会存储在数据库中,但可以通过模型实例进行访问和操作。
当我们使用 toArray()
或 toJson()
方法转换模型实例时,默认情况下只会包含模型的实际数据库字段。如果我们想包含一些虚拟属性,就需要使用 $appends
属性。
举个例子,假设我们有一个 User
模型,其中有一个虚拟属性 full_name
:
class User extends Model
{
protected $appends = ['full_name'];
public function getFullNameAttribute()
{
return $this->first_name . ' ' . $this->last_name;
}
}
在这个例子中,我们定义了 $appends
属性,将 'full_name'
添加到其中。这意味着当我们转换 User
模型实例时,full_name
属性将被包含在数组或JSON输出中:
$user = User::first();
return $user->toArray(); // 输出中包含 'full_name' 属性
return $user->toJson(); // 输出中包含 'full_name' 属性
使用 $appends
属性可以帮助您更方便地控制模型的输出,包括在API响应中返回虚拟属性。这样可以避免在每次使用模型时都手动调用 getAttribute()
方法来获取虚拟属性的值。
总之,$appends
属性是一个非常有用的功能,可以帮助您更好地管理和定制模型的数据输出。
- EG
## user.model
protected $appends = 'humanCreateAt';
public function getHumenCreateAtAttribute (){
return $this->create_at->diffForHumans();
}
补充知识
Accessors 和 Mutators 是 Laravel 模型中的两个非常有用的功能,用于自定义模型属性的访问和赋值。
- Accessors (访问器)
Accessors 允许您在返回模型属性值之前对其进行转换或修改。它们通过在模型中定义get{Attribute}Attribute
方法来实现。
class User extends Model
{
public function getFirstNameAttribute($value)
{
return ucfirst($value);
}
}
$user = User::first();
echo $user->first_name; // 输出: "John"
在上面的例子中,当我们访问 first_name
属性时,Accessor 方法 getFirstNameAttribute
会被调用,并将数据库中保存的值作为参数传递进去。这个方法可以对该值进行修改(如转换为首字母大写)后返回。
- Mutators (修改器)
Mutators 允许您在设置模型属性值之前对其进行转换或验证。它们通过在模型中定义set{Attribute}Attribute
方法来实现。
class User extends Model
{
public function setPasswordAttribute($value)
{
$this->attributes['password'] = bcrypt($value);
}
}
$user = new User;
$user->password = 'secret'; // 密码会被加密后存储
在上面的例子中,当我们设置 password
属性时,Mutator 方法 setPasswordAttribute
会被调用,并将赋值的 'secret'
字符串作为参数传递进去。这个方法可以对该值进行修改(如加密)后将其存储在模型的 $attributes
属性中。
Accessors 和 Mutators 的主要用途包括:
- 数据格式化:将数据库中存储的值转换为更加友好的格式。
- 安全性:在存储敏感数据(如密码)时进行加密或哈希。
- 业务逻辑:根据其他属性值计算出新的属性值。
通过使用 Accessors 和 Mutators,您可以更好地控制模型属性的读取和赋值过程,提高代码的可读性和可维护性。
如果您有任何其他疑问,欢迎继续询问。
标签:Laravel,name,模型,User,Model,user,appends,属性 From: https://www.cnblogs.com/laraveler/p/18189298