这种技术叫做什么?

时间:2011-03-22 23:07:42

标签: php orm

我正在构建一个简单的PHP库。

一个功能是允许这样做:

$myCatalog = new Catalog();  
// add books  
for ($i=0; $i<99; $i++) {  
    $myBook = new Book();  
    $myBook->title = 'Book ' . $i;  
    $myBook->parentId = $myCatalog->id;  
    $myBook->create();  
}  
// add other product  
for ($i=0; $i<99; $i++) {  
    $myProduct = new Product();  
    $myProduct->name = 'Product ' . $i;  
    $myProduct->parentId = $myCatalog->id;  
    $myProduct->create();  
}
$catalog_books = $myCatalog->getChildren('Book');  
$catalog_products = $myCatalog->getChildren('Product');

我想这不是真正的ORM功能,是吗?

2 个答案:

答案 0 :(得分:0)

我说它看起来像Active Record Pattern

通常,活动记录实体实施负责维护自己(Create()Update()Delete()

ORM(对象关系映射)通常是将数据库模式直接映射到POCO(普通旧代码对象)的时候。然后,中介(通常是存储库)负责维护您的实体。

大多数ORM系统采用这样的方式:

$user = new User();
$user->Username = "Aren";
$user->Email = "aren@somewhere.com";

$em = new EntityManager;
$em->persist($user);
$em->flush();

-----让我重新讲述-----

ORM 对象关系映射通常通过定义表和对象上的字段之间的关联来运行。有很多种方法,Doctrine ORM支持3种方法:代码注释,XML和YAML。

示例学说映射:

<?php
/** @Entity */
class MyPersistentClass
{
    /** @Column(type="integer") */
    private $id;
    /** @Column(length=50) */
    private $name; // type defaults to string
    //...
}

然后,通过实体管理器/存储库管理实体上的所有创建/读取/更新/销毁(CRUD)操作。 SQL是为您生​​成的,您不负责提供实体从数据库中取出或保留的方式。 (虽然有些ORM会给你灵活性来扩展它)。

ARP Active Record Pattern 是每个对象代表数据库中一行的位置。在许多常见的ARP实现中,大多数DB操作都暴露在对象上(尽管不是必需的)。

$user = new User();
$user->loadByID(42);

ORM Systems有时会使用ARP来帮助实体管理。

最终,如果没有某种元数据将对象绑定到它的行,我不会说它是一个ORM。

我猜它归结为:

  • 如果系统使用元数据自动将实体的属性/字段与相应的表colunms相关联。它可以归类为ORM系统。
  • 如果每个实体代表一个表的一行,并且通常(但可选)提供管理自身的功能,如.save() .delete()等。它可以归类为ARP(活动记录)图案)
  • 您的系统可以是两者。

答案 1 :(得分:0)

术语ORM(对象关系映射)表明存在涉及的数据库(或其他对象/数据空间),并且数据库中存在名为Catalog,Book,Product等的对象(例如表)。这些对象之间存在关系 - 目录有很多书籍,目录有很多产品等等。而且你已经创建了这些PHP对象来模拟应用程序中的数据库对象。但如果情况并非如此 - 也就是说,如果您没有将数据库对象和关系映射到PHP对象,那么这只是一个很好的旧的面向对象编程的示例。