1

假设我有两个表:BookCategory. Book有一个外键Category。书只能有类别。假设我要显示此表:

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 的同时保持表示层、数据源和域逻辑层之间的分离吗?如果可以,怎么做?我们如何有效地分割我们想要显示的数据?

4

2 回答 2

1

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

于 2011-11-02T14:54:10.977 回答
0

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

于 2011-11-01T19:29:28.387 回答