laravel模型是eloquent orm的核心,封装数据结构与业务逻辑;遵循表名、主键等约定,支持自定义;通过$fillable/$guarded控制批量赋值;提供访问器/修改器、多种关联关系、预加载及作用域机制。

Laravel模型是Eloquent ORM的核心载体,它不只是数据库表的映射,更是业务逻辑的封装中心。理解模型的本质,关键在于抓住“数据行为统一管理”这一设计意图——每个模型既描述结构(字段、关系),也承载操作(查询作用域、事件响应、状态转换)。
模型定义与基础约定
Laravel默认按类名复数形式匹配数据表(如User → users),主键默认为id且类型为自增整型。这些约定大幅减少配置,但可被显式覆盖:
- 用
$table指定表名 - 用
$primaryKey声明主键字段 - 用
$keyType声明主键类型(如string用于UUID) - 用
$incrementing = false关闭自增
模型自动管理时间戳字段created_at和updated_at,如需禁用或自定义字段名,可通过$timestamps和$createdAt/$updatedAt控制。
属性访问与数据安全
模型通过$fillable(白名单)或$guarded(黑名单)控制批量赋值权限,这是防止参数污染的关键防线。
- 推荐始终使用
$fillable,明确列出允许写入的字段 - 敏感字段如
password_hash、is_admin绝不列入$fillable - 对于只读字段(如
uuid),可在booted()中监听creating事件生成
访问器(Accessors)和修改器(Mutators)用于自动处理字段读写逻辑:
- 定义
getFullNameAttribute()可让$user->full_name返回拼接结果 - 定义
setPasswordAttribute($value)可自动哈希密码再存入
关联关系建模
Eloquent支持全部主流关系类型,定义清晰、调用自然:
- 一对多:
posts()方法返回hasMany(Post::class) - 多对多:
roles()配合中间表model_has_roles,支持同步、切换、附加等便捷方法 - 远层一对多(HasManyThrough):如
User → Post → Comment,直接获取用户所有评论 - 多态关联:适用于
Comment可属于Post或Video等不同模型的场景
预加载(with())是避免N+1查询的核心手段,支持嵌套(with('posts.comments'))、约束(with(['posts' => fn ($q) => $q->published()]))和延迟加载(load())。
模型作用域与复用查询
局部作用域是命名清晰、可链式调用的查询片段:
- 方法名以
scope开头,调用时省略该前缀,如scopeActive()→active() - 支持参数,例如
scopeWithinDays($query, $days = 7)
全局作用域则自动应用于所有查询,适合软删除(SoftDeletestrait已内置)或租户隔离,需谨慎使用并提供移除机制(withoutGlobalScope())。
不复杂但容易忽略











