ORM,AR,QB和DM有什么区别?

Xeo*_*oss 5 php database orm activerecord object

好吧,所以每个人都决定(并且有充分理由)海峡SQL是魔鬼.这给我们留下了许多方法,可以在我们的代码中放置一个"中间人"来将我们的代码与数据库分开.我现在要吐出我收集到的所有信息,希望有人可以设置我的海峡并告诉我我的建设.

ORM(对象关系映射)是一系列工具(松散或紧密集成的依赖),它将数据库行映射到应用程序中的对象.

在AR(Active-Record)中是一种ORM,其中数据库表或视图被包装到类中,因此对象实例绑定到表中的单个行.

数据映射(DM)是一种ORM,它是在两个不同数据模型之间创建数据元素映射的过程.

这三个人都声称这样工作:

$user = new User();
$user->name = 'Fred';
$user->save();
Run Code Online (Sandbox Code Playgroud)

通常使用类似这样的User类:

class User extends Model {
    // Specify the database table
    protected $table = "users";

    // Define your fields
    protected $fields = array(
        'id' => array('type' => 'int', 'primary' => true),
        'name' => array('type' => 'string', 'required' => true),
        'email' => array('type' => 'text', 'required' => true)
    );
}
Run Code Online (Sandbox Code Playgroud)

使用此设置,您可以轻松获取行而无需编写SQL.

// users
$users = $user->fetch(array('id' => 3));
Run Code Online (Sandbox Code Playgroud)

有些AR类实际上看起来更像这样:

$db->where('id' => 3);
$db->join('posts', 'posts.user_id = users.id');
$results = $db->get('users');
Run Code Online (Sandbox Code Playgroud)

好吧,现在这是毛茸茸的地方.每个人和他的兄弟似乎对什么类型的代码落在哪里有不同的看法.虽然大多数人都同意AR或DM是一种ORM - 但有时候从DM那里告诉AR的线条似乎都在抹黑.

我编写了一个使用单个对象($ db)的类,在该类中调用此对象,并处理SQL创建以保存结果/获取结果.

//Fetch the users
$results = $db->select('id, name')->where('id > 4')->get('users');

//Set them active
while($user = $results->fetch()) {
    $user->active = TRUE;
    $user->save();
}
Run Code Online (Sandbox Code Playgroud)

所以问题是"它是什么?",为什么人们不同意这些条款?

Aid*_*ell 5

你还不如补缩略词ORM,RM DM什么...这一切只不过是国家从一种介质转移到另一台,并包裹在功能/语义。

Sun MicrosystemsMicrosoft一直使用 Java 和 C# 来做这件事。让我们拿一些简单的东西给它一个新名字!真是个好主意。

如果你说 ORM .. 每个人都知道它是什么,有多种形式。你的代码看起来像 Linq 的东西。

没有魔法,但有很多流行语和大惊小怪恕我直言。


Van*_*cas 5

这不是直接的SQL是魔鬼 - 有时候,编写原始SQL以获得查询以执行您想要的方式几乎是必需的.对我来说,ORM更多的是消除手工工作而不是其他任何东西(比如不惜一切代价避免使用SQL).我只是不想用每个项目的所有手工制作的查询来设置我的所有代码对象.这只是一项荒谬的工作和思考.相反,ORM工具提供了一种很好的自动化方法来创建数据对象,否则需要大量的手动工作.现在我可以拥有自动单独的行对象,我可以扩展它并创建自定义函数,而不用考虑它.我可以从不同的表中检索相关的行,而无需手动编写该查询.

它看起来像你的用户类的例子是从phpDataMapper,如果是的话,它也有一些其他内置如自动表迁移礼节,所以你不必分发SQL文件的表结构以及一些辅助功能和其他东西.所有功能都旨在为您节省时间 - 这是主要目标.

AR和DM之间最重要的区别是,一个ActiveRecord(AR)行知道它自己的数据存储,从而也节省/每行对象的更新功能 - $用户>保存() - "记录"是"活跃".另一方面,使用DataMapper(DM),根据定义,每个单独的行都不知道它自己的数据存储.该行更像是一个可以在代码中使用的哑值对象.映射器负责将对该行的更改转换回数据存储区 - $ mapper-> save($ user).这是最重要的区别 - 您会发现大多数核心ORM功能在几乎所有实现中都是相同的.这主要取决于它在核心架构层面的组合方式.