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



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

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

我不懂PHP,但在许多ORM中你可以很容易地做到这一点。例如,在EF4.0中,你可以使用Include方法来获取类:像这样:$bookMapper->GetAll().Include("Category");它运行一个查询,但获取所有对象。我认为这种分离完全与ORM有关。

最新更新