【问题标题】:What is this technique called?这种技术叫什么?
【发布时间】:2011-03-22 23:07:41
【问题描述】:

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

【问题讨论】:

    标签: php orm


    【解决方案1】:

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

    【讨论】:

    • 嗨。有对应的表格。但是,我没有将书籍或产品连接到目录的连接表。我想重要的部分是: $myCatalog->getChildren('Book');我正在使用库函数getChildren(),它接受一个参数来指定你想要什么样的对象,以避免创建一个连接表。
    【解决方案2】:

    我会说它看起来像 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 为您提供了扩展它的灵活性)。

    ARPActive Record Pattern 是每个对象代表数据库中的一行。在许多常见的 ARP 实现中,大多数 DB 操作都直接在对象上公开(尽管不是必需的)。

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

    ORM 系统有时使用 ARP 来帮助进行实体管理。

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

    我想归根结底是这样的:

    • 如果系统使用元数据自动将实体的属性/字段与相应的表列相关联。它可以归类为 ORM 系统。
    • 如果实体每个代表一个表的一行,并且通常(但可选)提供管理自己的功能,如.save().delete()等,则可以归类为ARP(Active Record Pattern)李>
    • 您的系统可以两者兼有。

    【讨论】:

    • 它可能是ORM,那么。我也有对象的渐进式 id,因此所有对象都有唯一的 id。因此,我可以这样做: $user = EntityManager::getInstance($user_id);这在 ORM 系统中也很常见吗?
    • @njk:不客气。您需要进一步说明吗?如果不是,请不要忘记接受对您有用的答案。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    相关资源
    最近更新 更多