Как эффективно нарезать табличные данные, используя маппер данных и модель предметной области? - PullRequest
1 голос
/ 01 ноября 2011

Допустим, у меня есть две таблицы: 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

С моделью предметной области и картографом данных (определение Фаулера) у нас есть 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, сохраняя при этом разделение между представлением, источником данных и уровнем логики домена?Если я могу, как?Как мы можем эффективно разделить данные, которые мы хотели отобразить?

Ответы [ 2 ]

1 голос
/ 02 ноября 2011

Я думаю, что Mapper просто должен иметь метод Map () для сопоставления массива с объектом, тогда вы сможете использовать SQL напрямую через PDO, а затем просто отобразить результат на объекты.

0 голосов
/ 01 ноября 2011

Я не знаю PHP, но во многих ORM вы можете сделать это легко. Например, в EF4.0 вы можете использовать метод Include для выборки в классы togheter: что-то вроде этого: $ bookMapper-> GetAll (). Include ("Category"); и он запускает один запрос, но получает все объекты. Я думаю, что это разделение полностью относится к ORM.

...