Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php ORM、AR、QB和;DM?_Php_Database_Orm_Activerecord_Object - Fatal编程技术网

Php ORM、AR、QB和;DM?

Php ORM、AR、QB和;DM?,php,database,orm,activerecord,object,Php,Database,Orm,Activerecord,Object,好的,所以每个人都决定(并且有充分的理由)SQL是魔鬼的。这就给我们留下了许多在代码中放置“中间人”的方法,以将代码与数据库分开。我现在要把我收集的所有信息都吐出来,希望有人能给我指点迷津,告诉我我建造了什么 ORM(对象关系映射)是一系列工具(松散或紧密集成),用于将数据库行映射到应用程序中的对象 在AR(活动记录)中,是一种ORM,其中数据库表或视图被包装到一个类中,因此对象实例被绑定到表中的一行 数据映射(DM)是一种ORM,它是在两个不同的数据模型之间创建数据元素映射的过程 所有三个都声

好的,所以每个人都决定(并且有充分的理由)SQL是魔鬼的。这就给我们留下了许多在代码中放置“中间人”的方法,以将代码与数据库分开。我现在要把我收集的所有信息都吐出来,希望有人能给我指点迷津,告诉我我建造了什么

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

在AR(活动记录)中,是一种ORM,其中数据库表或视图被包装到一个类中,因此对象实例被绑定到表中的一行

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

所有三个都声称这样工作:

$user = new User();
$user->name = 'Fred';
$user->save();
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)
    );
}
$db->where('id' => 3);
$db->join('posts', 'posts.user_id = users.id');
$results = $db->get('users');
通常与用户类类似:

$user = new User();
$user->name = 'Fred';
$user->save();
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)
    );
}
$db->where('id' => 3);
$db->join('posts', 'posts.user_id = users.id');
$results = $db->get('users');
使用此设置,您可以轻松获取行,而无需编写SQL

// users
$users = $user->fetch(array('id' => 3));
有些AR类实际上看起来更像这样:

$user = new User();
$user->name = 'Fred';
$user->save();
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)
    );
}
$db->where('id' => 3);
$db->join('posts', 'posts.user_id = users.id');
$results = $db->get('users');
好了,这就是它变得多毛的地方。每个人和他的兄弟似乎对什么类型的代码在哪里都有不同的看法。虽然大多数人都同意AR或DM是ORM的一种类型,但有时区分AR和DM的线条似乎有污点

我编写了一个使用单个对象($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();
}

所以问题是“它是什么?”,为什么人们不同意这些术语呢?

你不妨用缩写词ORM,RM DM等等。。。所有这些都只是从一种媒介转移到另一种媒介的状态,并被包装在功能/语义中

Sun MicrosystemsMicrosoft始终使用Java和C#。让我们用一个简单的名字来命名它吧!好主意

如果你说。。每个人都知道它是什么,它有许多伪装。不过,您的代码看起来像Linq


没有魔法,但有很多流行语和小题大做。

同意@Aiden Bell。但我认为你指出这些区别是对的。我使用LINQtoSQL,在您的定义中,它只是ORM的活动记录样式。对我来说,这非常有效,因为我在很多绿地应用程序上工作,并从db开始构建我的课程。从那时起,我倾向于采用领域驱动的设计方法(我知道……这是一个类优先的概念)来处理我生成的类。对我来说,这让我很快走上正轨

说到这里,我还与实体框架和NHybernate合作过。实体框架是UBER数据映射器,NHybernate也是数据映射器,但没有那么复杂!我个人觉得实体框架还有很长的路要走。如果我需要更多的复杂性,比如在一个棕色地带的应用程序中,数据库是固定不变的,我需要让我的类来表示我的应用程序而不是数据库,那么我更愿意使用NHybernate及其数据映射功能


我认为每种工具都有它的位置。说它们都是一样的是不公平的。活动记录非常好,因为它为我生成直接表示我的数据库的类。当我创建数据库或数据库紧密地代表我的应用程序普遍存在的术语和概念时,这一点就起作用了。当我有一个固定的数据库没有意义或无法清晰地映射到我的应用程序时,ORM的映射类型就会工作。在这种情况下,我可以通过ORM工具的映射功能封装数据库中的复杂性或不足,以创建一个丰富的域。

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

看起来您的用户类示例来自,如果是这样的话,它还具有一些其他内置细节,如自动表迁移,这样您就不必为表结构分发SQL文件以及一些辅助函数和其他内容。包括的所有功能都旨在节省您的时间-这是主要目标


AR和DM之间最重要的区别在于ActiveRecord(AR)行知道自己的数据存储,因此在每个行对象上都有保存/更新功能-$user->save()-“记录”是“活动的”。另一方面,使用DataMapper(DM),根据定义,每一行都不知道自己的数据存储。行更像是一个哑值对象,可以在代码中使用。映射器负责将对该行的更改转换回数据存储-$mapper->save($user)。这是最显著的区别——您会发现,在几乎任何实现中,大多数核心ORM特性都是相同的。这主要是在核心架构级别如何组合的问题。

Buzzword Bingo。。。满座!同意,我写了我的第一个ORM,甚至不知道有一个流行词!