2011-03-22 102 views
0

我正在构建一个简单的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的功能,是吗?

回答

0

我会说,它看起来像一个Active Record Pattern

典型的活动记录实体实现是负责维护自己(Create()Update()Delete()

ORM(对象关系映射)通常是当你映射数据库模式直接传递给POCO(普通旧代码对象)。然后一个中介(通常是Repository)负责维护你的实体。

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

$user = new User(); 
$user->Username = "Aren"; 
$user->Email = "[email protected]"; 

$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,活动记录模式是每个对象代表数据库中的一行的位置。在许多常见的ARP实现中,大多数数据库操作都暴露在对象上(尽管不是必需的)。

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

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

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

我猜它归结为是这样的:

  • 如果系统使用元数据来自动assoicate实体的属性/字段与相应的表colunms。它可以被分类为一个ORM系统。
  • 如果每个实体代表一个表的单个行,commonally(但可选的)提供的功能来管理自己喜欢.save().delete()等。它可以被归类为一个ARP(活动记录模式)
  • 您的系统可以都是。
+0

那么它可能是ORM。我也有对象的进步id,所以所有对象都有唯一的ID。因此,我可以这样做:$ user = EntityManager :: getInstance($ user_id); 这在ORM系统中也很常见吗? – njk 2011-03-23 00:02:25

+0

@njk:我已经更新了我的回复。 – Aren 2011-03-23 00:15:36

+0

谢谢! - njk – njk 2011-03-23 22:44:53

0

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

+0

嗨。有相应的表格。 但是,我没有连接表将书籍或产品连接到目录。 我想重要的部分是: $ myCatalog-> getChildren('Book'); 我正在使用库函数getChildren(),它使用一个参数来指定想要的对象类型,以避免创建连接表。 – njk 2011-03-22 23:55:43