Analogue ORM入门实战教程手把手写出第一个Entity与EntityMap映射类【免费下载链接】analogueAnalogue ORM : Data Mapper ORM for Laravel/PHP项目地址: https://gitcode.com/gh_mirrors/an/analogueAnalogue 是一个专为 PHP 和 Laravel 打造的Data Mapper数据映射器ORM它用严格的关注点分离取代了 Eloquent 的 Active Record 模式。本文带你从 0 开始手把手写出第一个 Entity 实体类与 EntityMap 映射类掌握对象与数据库表之间的映射核心玩法。为什么选择 Analogue ORMLaravel 自带的 Eloquent 很优秀但它属于 Active Record 模式——模型既负责数据又负责行为在复杂业务中容易出现架构耦合。Analogue ORM 采用Data Mapper 模式把模型层拆成两个类对比项EloquentActive RecordAnalogueData Mapper模型数量1 个 Model1 个 Entity 1 个 EntityMap业务逻辑混在 Model 里集中在纯 PHP 实体中值对象Value Object难以正确实现原生支持单表继承基本不可能完整支持懒加载 / 急加载支持支持 一句话理解Entity 是你的领域对象纯业务EntityMap 是翻译官负责告诉 ORM 数据库里长什么样。环境安装一条命令搞定在 Laravel 项目根目录执行composer require analogue/ormAnalogue 要求PHP 7.0兼容 Laravel 5.5 / 5.6作为 Laravel 包会自动发现服务提供者无需额外配置见 composer.json 中的extra.laravel.providers自动注册逻辑。如果你的本地环境没有 Composer 包源也可以先克隆仓库源码再引入git clone https://gitcode.com/gh_mirrors/an/analogue第一步编写你的第一个 Entity 实体Entity 就是普通的 PHP 类继承Analogue\ORM\Entity即可获得魔法 Getter/Setter、隐藏属性、数组转换等能力实现见 src/Entity.phpuse Analogue\ORM\Entity; class Blog extends Entity { // 可以直接定义构造函数和领域方法 public function __construct() { $this-title ; } }就是这么简单你甚至不需要写任何 getter/setter——Analogue 通过__get/__set魔法方法自动读写属性源码见 src/Entity.php#L23-L60。第二步编写 EntityMap 映射类EntityMap 继承Analogue\ORM\EntityMap核心实现见 src/EntityMap.php负责三件事表名映射默认取实体类名的复数蛇形命名如Blog→blogs表主键定义默认为id关系定义用方法声明一对一、一对多等关系。对应上面的 Blog 实体写一个最小可用的映射类use Analogue\ORM\EntityMap; class BlogMap extends EntityMap { // 开启 created_at / updated_at 时间戳 public $timestamps true; // 可选自定义表名 // protected $table my_blogs; // 可选自定义主键 // protected $primaryKey uuid; // 可选数据库列名与属性名不一致时做映射 // protected $mappings [title blog_title]; }命名约定EntityMap 放在与实体相同命名空间下时会自动检测例如App\Blog对应App\BlogMap。第三步定义实体之间的关系关系的声明方式与 Eloquent 几乎一致只是写在 Map 里。参考项目测试用例中的完整示例 tests/src/Maps/BlogMap.phpclass BlogMap extends EntityMap { public $timestamps true; // 博客属于一个用户 public function user(Blog $blog) { return $this-belongsTo($blog, User::class); } // 一个博客有多篇文章 public function articles(Blog $blog) { return $this-hasMany($blog, Article::class); } }Analogue 支持的常用关系类型源码目录 src/Relationships/hasOne/hasMany一对一 / 一对多belongsTo/belongsToMany多对一 / 多对多morphOne/morphMany/morphTo/morphToMany多态关系hasOneThrough/hasManyThrough穿透查询embedsOne/embedsMany嵌入值对象这是 Eloquent 做不到的如把图片尺寸存成 JSON 字段第四步用 mapper() 持久化与查询Analogue 提供全局辅助函数mapper()定义在 src/helpers.php返回实体的 Mapper 对象use TestApp\Blog; // 创建并保存Analogue 会自动级联同步关联对象 $blog new Blog; $blog-title 我的第一个博客; mapper(Blog::class)-store($blog);查询同样流畅Mapper 支持完整的链式 Query Builder// 取第一条 $blog mapper(Blog::class)-first(); // 条件查询 急加载关联 $blogs mapper(Blog::class) -where(title, like, %博客%) -with(articles) // 急加载避免 N1 问题 -get(); // 分页 $paginator mapper(Blog::class)-paginate(15);✨ 只需store($blog)保存主实体Analogue 会在幕后自动同步所有关联的 Blog、Article 对象省去一堆手动save()。项目源码结构速览 理解以下核心文件能帮你快速深入 Analogue 内部机制实体基类src/Entity.php映射基类src/EntityMap.phpMapper 核心store/delete/事件src/System/Mapper.php全局辅助函数src/helpers.php事件系统Creating/Stored/Deleted 等src/Events/软删除 / 时间戳插件src/Plugins/更多实体映射范例tests/src/Maps/常见新手问题 FAQQ1Entity 里可以直接写构造函数吗可以。Analogue 通过doctrine/instantiator绕过构造函数创建实例若实体需要依赖注入在 Map 中设置$dependencyInjection true即可见 src/System/Mapper.php#L554-L563。Q2数据库列名是蛇形、属性想用小驼峰怎么办在 Map 中开启protected $camelCaseHydratation true;或使用$mappings数组手动映射列名如remember_token→rememberToken参考 tests/src/Maps/UserMap.php。Q3怎么开启软删除和时间戳在 Map 中声明public $softDeletes true;和public $timestamps true;两者都由 src/EntityMap.php 内置支持。总结恭喜你已经掌握了 Analogue ORM 的核心工作流Entity继承Entity的纯业务实体零样板代码EntityMap继承EntityMap的映射类配置表名、时间戳、关系mapper()一行代码完成对象的保存、查询、删除。相比 EloquentAnalogue 用两个类换一份清晰让领域模型不再被框架污染非常适合需要值对象、单表继承等企业级场景的 Laravel 项目。下一步建议阅读仓库内的测试目录那里有涵盖所有关系类型的完整可运行示例tests/cases/Relationships/。【免费下载链接】analogueAnalogue ORM : Data Mapper ORM for Laravel/PHP项目地址: https://gitcode.com/gh_mirrors/an/analogue创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考