如何使用数据映射器和域模型有效地切片表格数据?

时间:2011-11-01 15:44:03

标签: php oop datamapper domain-model

假设我有两个表:BookCategoryBookCategory的外键。书只能在类别上。假设我要显示此表:

Book Title              | Category ID       | Category Name
-------------------------------------------------------------------------
Lord of the Rings       | 1                 | Fiction
Ender's Game            | 2                 | Science Fiction
Purpose Driven Life     | 3                 | Religious

使用域模型和数据映射器(Fowler的定义),我们有BookCategory个对象,每个对象都有自己的映射器。这里的问题是因为两者都是分离的实体,我最终会运行大量查询来显示上面的简单表:

$booksArray = $bookMapper->getTopTenBooks();
$viewData = array();

foreach ($booksArray as $book)
{
    $categoryID = $book->getCategoryID();
    $category = $categoryMapper->getByID($categoryID);
    $viewData[] = array(
        'book' => $book,
        'category' => $category
    );
}

return $view->load($viewData);

这是获取要显示的书籍列表的一个查询,以及许多查询以获取与每本书相关的相应类别对象。

问题是,使用SQL,我可以按照我想要的方式对数据进行切片。我实际上可以通过一个查询获得我需要的所有数据:

SELECT
    book.name, category.name
FROM
    book LEFT JOIN category ON (book.cat_id = category.id)

我是否可以在保持表示,数据源和域逻辑层之间的分离的同时使用此SQL?如果我可以,怎么样?我们如何有效地切片我们想要显示的数据?

2 个答案:

答案 0 :(得分:1)

我认为Mapper应该有Map()方法将数组映射到对象,然后你就可以直接通过PDO使用SQL,然后只将结果映射到对象。

答案 1 :(得分:0)

我不懂PHP,但在许多ORM中你可以轻松完成。例如,在EF4.0中,你可以使用Include方法来获取类togheter:类似这样的东西:$ bookMapper-> GetAll()。Include(“Category”);它运行一个查询但获取所有对象。我认为这种分离完全与ORM有关。