假设我有两个表: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同时仍然保持表示,数据源和域逻辑层之间的分离吗?如果我能,怎么做?我们如何有效地分割我们想要显示的数据?
我认为Mapper应该有Map()方法将数组映射到对象,然后您将能够通过PDO直接使用SQL,然后将结果映射到对象。
我不懂PHP,但在许多ORM中你可以很容易地做到这一点。例如,在EF4.0中,你可以使用Include方法来获取类:像这样:$bookMapper->GetAll().Include("Category");它运行一个查询,但获取所有对象。我认为这种分离完全与ORM有关。