2026/5/21 21:53:24
网站建设
项目流程
山西做网站的,怎样在网站上做营业执照公示,成都网站建设,官方网站建设状况ORM#xff08;对象关系映射#xff09;的本质#xff0c;是将面向对象的实体操作#xff0c;自动转换为关系型数据库的 SQL 语句#xff0c;同时处理对象-表、属性-字段、关系-外键的双向映射。
它不是“魔法”#xff0c;而是元数据驱动的代码生成器 查询构建器 结果…ORM对象关系映射的本质是将面向对象的实体操作自动转换为关系型数据库的 SQL 语句同时处理对象-表、属性-字段、关系-外键的双向映射。它不是“魔法”而是元数据驱动的代码生成器 查询构建器 结果集映射器。一、核心映射机制对象 ↔ 表1.模型定义即元数据classUserextendsModel{protected$tableusers;// 表名protected$fillable[name,email];// 可批量赋值字段protected$casts[email_verified_atdatetime];// 类型转换}元数据来源显式配置$table,$fillable隐式约定类名User→ 表users运行时探测DESCRIBE users获取字段类型。2.属性 ↔ 字段映射读取$userUser::find(1);echo$user-name;// 触发 __get()__get()从$attributes数组取值$attributesSQL 查询结果集解析后存储。写入$user-nameJohn;// 触发 __set()$user-save();// 生成 UPDATE__set()存入$attributes脏检查Dirty Checking仅更新修改字段。本质模型实例 属性数组 元数据 脏状态。二、SQL 生成流程从对象操作到 SQL1.查询构建器Query Builder链式调用User::where(active,1)-orderBy(name)-get();内部流程渲染错误:Mermaid 渲染失败: Parse error on line 2: ...aph LRA[User::where()] -- B[创建 Query B ----------------------^ Expecting SQE, DOUBLECIRCLEEND, PE, -), STADIUMEND, SUBROUTINEEND, PIPE, CYLINDEREND, DIAMOND_STOP, TAGEND, TRAPEND, INVTRAPEND, UNICODE_TEXT, TEXT, TAGSTART, got PS2.写操作 SQL 生成操作SQL 生成逻辑create()INSERT INTO users (name, email) VALUES (?, ?)save()UPDATE users SET name? WHERE id?仅脏字段delete()DELETE FROM users WHERE id?关键机制参数绑定防 SQL 注入脏字段检测getDirty()返回修改字段。三、关系处理对象关系 ↔ SQL JOIN1.一对一/多对一HasOne / BelongsToclassUserextendsModel{publicfunctionprofile(){return$this-hasOne(Profile::class);}}SQL 生成$userUser::with(profile)-first();// SELECT * FROM users LIMIT 1// SELECT * FROM profiles WHERE user_id IN (1)策略预加载Eager Loading→ 避免 N1。2.一对多/多对多HasMany / BelongsToManyclassUserextendsModel{publicfunctionposts(){return$this-hasMany(Post::class);}}SQL 生成$user-posts;// SELECT * FROM posts WHERE user_id 13.多对多中间表classUserextendsModel{publicfunctionroles(){return$this-belongsToMany(Role::class,user_roles);}}SQL 生成$user-roles;// SELECT roles.* FROM roles// INNER JOIN user_roles ON roles.id user_roles.role_id// WHERE user_roles.user_id 1核心关系 外键约束 预加载策略。四、性能边界ORM 的代价与优化1.N1 问题最常见陷阱现象$usersUser::all();foreach($usersas$user){echo$user-posts-count();// 每次查 DB}SQLSELECT*FROMusers;-- 1 次SELECTCOUNT(*)FROMpostsWHEREuser_id1;-- N 次修复User::with(posts)-get();// 预加载2.SELECT *问题现象查询大文本字段如content但只需id, title修复User::select(id,name)-get();3.过度抽象代价场景复杂报表查询多表 JOIN 聚合问题ORM 生成低效 SQL解法直接写 SQLDB::select(SELECT ...);4.批量操作低效现象foreach($dataas$item){User::create($item);// N 次 INSERT}修复User::insert($data);// 1 次 INSERT五、高阶机制Laravel Eloquent 的实现细节1.查询构建器Illuminate\Database\Query\Builder职责累积wheres,orders,groups生成 SQL 片段执行 PDO。2.模型Illuminate\Database\Eloquent\Model职责属性访问__get()/__set()关系定义hasOne(),hasMany()事件触发creating,saved。3.结果映射Hydration流程$results$pdo-fetchAll();// [ [id1, nameJohn] ]foreach($resultsas$row){$usernewUser;$user-setRawAttributes($row);// $attributes $row}六、终极心法ORM 是双刃剑不要问“ORM 能做什么”而要问“SQL 本应如何写”。适用场景CRUD 操作简单关系查询快速原型。禁用场景复杂报表高频批量写入性能敏感路径。真正的工程能力不在“用 ORM”而在“知道何时不用 ORM”。这才是专业 PHP 程序员的数据库观。