适用于 PHP 和 Laravel 的直观数据映射 ORM

v6.2.0 2020-04-14 01:14 UTC

README

(本项目正在寻找新的维护者)

Analogue ORM

Latest Stable Version Latest Unstable Version License Build Status StyleCI

Analogue 是一个灵活、易于使用的 ORM,适用于 PHP。它通过使用 Data Mapper 模式代替原始的 Active Record 方法,将随 Laravel 框架一起提供的 Eloquent ORM 进行了转换。通过使用严格的关注点分离;例如,您可以使用 Value ObjectsSingle-table-inheritance,这在原生 ORM 中很难/无法正确实现。

作为一个 Laravel 包,它完美地集成在框架中,并提供了一个更强大的持久层,在保持简单和愉悦的开发体验的同时,允许构建企业级应用程序。

安装

composer require analogue/orm

有关更多信息,请参阅 配置

概念

概念很简单;您的模型层使用 2 个类定义:一个 Entity,可以是任何 PHP 类或扩展基础 Analogue\ORM\Entity 类(它提供了魔法获取器和设置器),以及一个 EntityMap,它定义关系、转换、表名和数据库列名。

例如,这是一个简单的领域模型

use Analogue\ORM\Entity;
use Illuminate\Support\Collection;

class Blog extends Entity
{
    public function __construct()
    {
        $this->posts = new Collection;
    }

    public function addPost(Post $post)
    {
        $this->posts->push($post);
    }
}

class Post extends Entity
{
 
}

我们可以使用这些类来指导 Analogue 如何将这些对象关联起来

use Analogue\ORM\EntityMap;

class BlogMap extends EntityMap
{
    public function posts(Blog $blog)
    {
        return $this->hasMany($blog, Post::class);
    }
}

class PostMap extends EntityMap
{
    public function blog(Post $post)
    {
        return $this->belongsTo($post, Blog::class);
    }
}

现在我们可以创建相关实例或对象并将它们持久化到数据库中

$blog = new Blog;
$blog->title = "My first blog";

$post = new Post; 
$post->title->"My first post";

$blog->addPost($post);

// Only the blog instance need to explicitely stored; Analogue takes care of synchronizing
// related objects behinds the scene. 

mapper(Blog::class)->store($blog);

一旦我们的对象被持久化到数据库中,我们就可以使用流畅的查询构建器来查询它们

$blog = mapper(Blog::class)->first();

echo $blog->posts->first()->title; // 'My first post'

文档

有关更多详细信息,请参阅 文档

特性

  • 框架无关性
  • 懒加载
  • 急加载
  • 时间戳
  • 软删除
  • 值对象
  • 多态关系
  • 动态关系
  • 单表继承
  • 将实体转换为数组 / JSON
  • 灵活的事件系统
  • 原生多数据库连接支持
  • 通过自定义数据库驱动程序/插件进行扩展

更新日志

版本 5.6

  • Laravel 5.6 支持
  • 恢复映射名称与属性名称不相同的 DB 列的能力。
  • 添加将 DB 青蛇命名法列映射到实体上的驼峰命名属性的能力。

版本 5.5

  • Laravel 5.5 支持
  • 将最小要求提升到 PHP7
  • 通过基于反射的活化/脱水实现了对纯 PHP 对象的完整支持。
  • 改进了懒加载代理。
  • 新的、更灵活的值对象实现,现在可以作为 embedsOne()embedsMany() 关系来定义。
  • 嵌入的值对象现在可以存储为 mysql JSON 字段。
  • Analogue 实体现在可以使用 Laravel 的 IoC 容器 或任何 PSR-11 兼容的容器来实例化。
  • 添加了 MongoDB 驱动程序。
  • 包自动发现(L5.5)

版本 5.4

  • Illuminate 5.4 兼容性。
  • 添加将 DB 列名称映射为与属性名称不匹配的能力。

版本 5.3

  • Illuminate 5.3 兼容性。
  • 现在完全支持单表继承。

版本 5.1

  • Illuminate 5.1 + 5.2 兼容性。

版本 5.0

  • Analogue 版本现在与 illuminate 版本同步。

版本 2.1.3

  • 基础实体类中的 Mutator 功能。
  • 能够在不进行懒加载的情况下将实体添加到代理集合中。

版本 2.1

  • 包现在是框架无关的。
  • 现在支持实现 Mappable 接口的任何普通对象。
  • 引入 MappableTrait 以快速实现。
  • 现在可以直接在映射对象上运行查询。
  • 存储/删除方法现在接受数组和集合作为参数。
  • 当实体映射与实体在同一命名空间中时,会自动检测实体映射。
  • 基础实体类支持隐藏属性。
  • 许多与工作流相关的改进。

版本 2.0

  • 支持 Laravel 5。

文档

有关完整文档,请查看 wiki

许可证

本软件包受 MIT 许可证 许可。