eloquent 是三层协作的模型层:model 定义规则并转发调用,builder 组装查询逻辑(依赖 query\builder),connection 执行 sql 并由 hydrator 装配对象;其“对象感”是假象,本质是查询 dsl 与结果装配器。

Eloquent 不是 SQL 生成器,而是三层协作的模型层:Model 负责业务状态,Builder 负责组装查询逻辑,Connection 负责执行。你写的 User::where('active', 1)->first(),背后实际是 Builder 拼出 SELECT * FROM users WHERE active = ? LIMIT 1,再由 Connection 用 PDO 执行。
Model 是门面,不是数据容器
Model 类本身不查数据库,它只定义规则(如 $table、$fillable)、关系和行为。真正干活的是静态调用触发的 __callStatic() 方法——它把 where、get 这类调用转发给 Builder 实例。
- 当你写
User::find(5),其实是User::query()->find(5),query()返回一个Illuminate\Database\Eloquent\Builder -
Model的属性(如createdAt)会自动映射到数据库字段created_at,靠的是getAttribute()和setAttribute()中的驼峰转下划线逻辑 - 模型实例的
$attributes和$original两个数组,分别存当前值和原始值,用于脏检查(isDirty())和批量更新
Builder 是引擎,但依赖 Query\Builder
Eloquent\Builder 并不直接拼 SQL,它继承自 Illuminate\Database\Query\Builder,只是加了模型专属逻辑:软删除条件注入、全局作用域、关联预加载解析等。
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
- 调用
with('posts')时,Eloquent\Builder会拆解关联定义,生成额外的SELECT或JOIN查询,并协调多个Query\Builder实例 -
where()接收字符串、数组、闭包三种参数形式,底层统一转为wheres数组,最终由Query\Builder的toSql()组装成语句 - 链式调用能成立,是因为每个方法(如
where()、orderBy())都返回$this,而最终get()或first()才触发执行
Connection 执行后,Hydrator 把结果变对象
SQL 执行返回的是原始数组(PDOStatement->fetchAll()),Connection 把它交给 Hydrator(在 Eloquent\Builder 内部),后者用反射和 new static 创建模型实例,并逐个填充 $attributes。
- 如果查的是单条记录(
first()),返回一个User对象;查多条(get()),返回Illuminate\Database\Eloquent\Collection,它包装了对象数组,提供map()、filter()等方法 -
Collection不是 PHP 原生数组,不能直接用array_map,必须调用它的实例方法或先->toArray() - 关联数据不会自动加载——
$user->posts第一次访问时才触发新查询(延迟加载),除非你提前用with('posts')预加载
真正容易被忽略的是:Eloquent 的“对象感”是假象。它没有持久化状态,每次 save() 都是全新 INSERT/UPDATE;关联也不是内存引用,而是按需查库。别把它当 Active Record 的“活对象”,它更像带模板的查询 DSL + 结果装配器。










