假设我有两个表:Book
和Category
. 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 的定义),我们拥有对象Book
,Category
每个对象都有自己的映射器。这里的问题是,由于两者都是独立的实体,我最终会运行大量查询来显示上面的简单表:
$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 的同时保持表示层、数据源和域逻辑层之间的分离吗?如果可以,怎么做?我们如何有效地分割我们想要显示的数据?