Laravel中的Model

在 Laravel 中,模型(Model)中的一些常用方法包括 fillableguardedtimestampsprimaryKey 等,它们用于定义模型的属性、保护属性、自动维护时间戳和主键等。下面我逐个介绍这些方法:

  1. fillable: fillable 属性用于定义可以批量赋值的属性(字段),也就是允许用户通过模型的 createfill 方法来设置的属性。如果你在模型中使用了 fillable 属性,那么只有在 fillable 中列出的属性才能够通过批量赋值来设置。这有助于防止潜在的 Mass Assignment 攻击。例如:

    protected $fillable = ['name', 'email', 'password'];
    
  2. guarded: guarded 属性用于定义不可以批量赋值的属性(字段),也就是需要保护的属性。如果你在模型中使用了 guarded 属性,那么除了在 guarded 中列出的属性之外,所有其他属性都可以通过批量赋值来设置。你可以将 guarded 属性设置为空数组(protected $guarded = [];),这样所有属性都可以进行批量赋值。不过这种方式要谨慎使用,因为可能存在安全风险。例如:

    protected $guarded = ['admin'];
    
  3. timestamps: timestamps 属性用于控制模型是否自动维护时间戳,包括 created_atupdated_at。默认情况下,Laravel 会自动为每个模型添加这两个时间戳字段,但如果你不需要这些时间戳字段,可以将 timestamps 属性设置为 false。例如:

    public $timestamps = false;
    
  4. primaryKey: primaryKey 方法用于获取模型的主键字段名称。默认情况下,Laravel 假定主键字段名为 id,但你也可以在模型中重写 primaryKey 方法来指定其他主键字段名。例如:

    protected $primaryKey = 'user_id';
    
  5. $casts
    在 Laravel 的 Eloquent ORM 中,$casts 属性是一个数组,它提供了一个简便的方法来将数据库中的属性值转换为常见的数据类型。当你从数据库获取一个模型属性时,Laravel 会自动将该属性转换为你在 $casts 数组中指定的数据类型。同样,当你设置一个模型属性时,Laravel 会自动将该属性转换回其数据库原始数据类型。

这是 $casts 属性的一些常见用法:

  • 数组 & JSON:将存储在数据库中的 JSON 或序列化的文本转换为 PHP 数组。
  • 对象:将 JSON 或序列化的文本转换为 PHP 对象。
  • 集合:将 JSON 数组转换为 Laravel 集合(Collection)实例。
  • 日期 & 时间:将日期和时间字符串转换为 Carbon 实例,这是一个扩展了 PHP DateTime 类的库。
  • 浮点数、整数 & 布尔值:将字符串转换为相应的 PHP 数据类型。

这里是一个实际的例子:

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    /**
     * The attributes that should be cast.
     *
     * @var array
     */
    protected $casts = [
        'is_active' => 'boolean', // 将 is_active 列转换为布尔值
        'price' => 'float', // 将 price 列转换为浮点数
        'options' => 'array', // 将 options 列(存储为 JSON)转换为 PHP 数组
        'released_at' => 'datetime:Y-m-d', // 将 released_at 列转换为 Carbon 实例,并格式化日期
    ];
}

在上面的例子中,如果 is_active 列在数据库中是一个整数(例如,0 或 1),它会被自动转换为 falsetrueprice 列将被转换为浮点数,options 列(假设它是以 JSON 格式存储的)将被转换为一个 PHP 数组。最后,released_at 列将被转换为一个 Carbon 实例,这样你就可以使用 Carbon 提供的各种日期和时间相关的方法。

从 Laravel 7 开始,你可以在日期和时间的转换中指定格式,如 'datetime:Y-m-d',这样就可以在转换为 Carbon 实例的同时对日期进行格式化。

Laravel 的 $casts 功能非常强大,因为它允许你在不改变数据库模式的情况下,以更符合你应用程序逻辑的方式来操作数据。此外,它还可以提高代码的可读性和减少类型转换时可能出现的错误。

这些方法在定义模型时非常有用,它们允许你更加灵活地控制模型的属性、保护属性和时间戳等行为。

在 Laravel 的 Eloquent ORM 中,模型(Model)有几个 protected 属性,这些属性用于定义模型的行为以及它如何与数据库表交互。以下是一些最常用的 protected 属性:

  1. $table:指定模型对应的数据库表名。

    protected $table = 'users'; // 指定这个模型对应的表是 `users`
    
  2. $primaryKey:指定模型的主键字段。

    protected $primaryKey = 'id'; // 指定主键字段,默认是 `id`
    
  3. $fillable:定义哪些列可以使用批量赋值。

    protected $fillable = ['name', 'email', 'password']; // 只有这些列可以批量赋值
    
  4. $guarded:定义哪些列不可以使用批量赋值。

    protected $guarded = ['id']; // `id` 字段不可以被批量赋值
    
  5. $casts:定义如何将数据库字段值转换为常用的数据类型。

    protected $casts = [
        'is_admin' => 'boolean', // 将 `is_admin` 字段转换为布尔值
        'created_at' => 'datetime:Y-m-d', // 将 `created_at` 字段转换为指定格式的日期时间
    ];
    
  6. $dates:定义哪些字段应该被自动处理为 Carbon(日期时间)实例。

    protected $dates = ['created_at', 'updated_at']; // 这些字段会自动转换为 Carbon 实例
    
  7. $appends:定义访问器(Accessor)添加到模型数组和 JSON 表示中的属性。

    protected $appends = ['is_admin'];
    
    public function getIsAdminAttribute()
    {
        return $this->attributes['admin'] == 1;
    }
    
  8. $hidden:定义在模型数组和 JSON 显示时应该隐藏的字段。

    protected $hidden = ['password', 'remember_token']; // 这些字段在数组或 JSON 显示时会被隐藏
    
  9. $visible:与 $hidden 相反,定义在模型数组和 JSON 显示时应该显示的字段。

    protected $visible = ['name', 'email']; // 只有这些字段在数组或 JSON 显示时会被包含
    
  10. $timestamps:表示模型是否应该自动维护 created_atupdated_at 时间戳。

    public $timestamps = false; // 如果设置为 false,则不会自动维护时间戳
    

这些属性在模型类中定义,允许你根据需要定制模型的行为。例如,使用 $fillable$guarded 可以保护你的应用程序不受到批量赋值漏洞的影响。使用 $casts 可以确保当你从数据库获取数据时,它们会自动转换为你希望的数据类型,这样可以简化数据处理和验证的工作。

posted @ 2024-05-15 17:57  Laravel自学开发  阅读(340)  评论(0编辑  收藏  举报