2011-03-22 99 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