【发布时间】:2010-11-04 03:39:34
【问题描述】:
好的,所以每个人都认为(并且有充分的理由)严格的 SQL 是魔鬼。这给我们留下了许多在代码中放置“中间人”以将代码与数据库分开的方法。我现在要把我收集到的所有信息都吐出来,希望有人可以让我束手无策,告诉我我建造了什么。
ORM(对象关系映射)是一系列工具(松散或紧密集成的依赖),可将数据库行映射到应用程序中的对象。
在 AR(Active-Record)中是一种 ORM,其中数据库表或视图被包装到一个类中,因此对象实例被绑定到表中的单行。
数据映射 (DM) 是一种 ORM,它是在两个不同数据模型之间创建数据元素映射的过程。
这三个都声称是这样工作的:
$user = new User();
$user->name = 'Fred';
$user->save();
通常使用类似这样的 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)
);
}
通过此设置,您无需编写 SQL 即可轻松获取行。
// users
$users = $user->fetch(array('id' => 3));
一些 AR 类实际上看起来更像这样:
$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();
}
所以问题是“它是什么?”,为什么人们不同意这些条款?
【问题讨论】:
-
流行词宾果游戏...满座!
标签: php database orm activerecord object