Использование преобразователей данных в Zend Framework

Например:

Мне нужно получить набор идентификаторов пользователей мужского пола, имен и фамилий, но больше ничего.

Итак, у меня есть функция в UserMapper, называемая fetchAllMaleUsers(), которая возвращает набор сущностей пользователя.

i.e:

public function fetchAllMaleUsers() {
        $select = $this->getDbTable()
                        ->select()
                        ->from($this->getDbTable(),
                                array('ID', 'FirstName', 'LastName'))
                        ->where('Gender = ?', 'M');

        $resultSet = $this->getDbTable()->fetchAll($select);

        $users = array();
        foreach ($resultSet as $row) {
            $user = new Application_Model_User();
            $user->setId($row->ID)
                 ->setFirstName($row->FirstName)
                 ->setLastName($row->LastName);
            $users[] = $user;
        }

        return $users;
    }
  1. Эта функция относится к слою картографа?
  2. Можно ли установить только идентификатор, имя и фамилию каждого пользователя?

person Craig    schedule 18.11.2010    source источник


Ответы (2)


1) Отлично подходит для картографа/шлюза или как вы его называете.
2) Вы можете сделать, но я крайне не одобряю это. Почему? Позже в вашем приложении вы не сможете сказать, откуда вы взяли модель. Таким образом, вам придется проверять, установлено ли значение в вашей модели каждый раз, когда вы не уверены, установлено ли оно, или вам понадобятся некоторые элементы автозагрузки для отсутствующих значений (что так же хуже, как отсутствующие вещи). Другая причина заключается в том, что вы не можете повторно использовать функцию для других целей, где вам могут понадобиться другие свойства пользовательской модели. Последняя причина, на самом деле, заключается в том, что модель представляет собой полную сущность в любое время, а не ее части. И нет никакой реальной причины, почему бы не загружать все поля (помимо ссылок на другие объекты, которые в любом случае должны загружаться автоматически).

person Fge    schedule 18.11.2010
comment
Спасибо, я просто колебался, потому что запрос для каждого столбца кажется ненужным вычислением для БД. Но, возможно, это не проблема. Итак, всякий раз, когда я пытаюсь получить свойство сущности пользователя, я должен сопоставлять каждый столбец с сущностью пользователя? - person Craig; 19.11.2010
comment
@Крейг: Да. Интересно, что поначалу люди склонны оптимизировать не в том месте. Извлечение дополнительных столбцов из той же таблицы базы данных почти не требует дополнительных затрат (конечно, если вы храните там двоичные данные...). Если вы хотите оптимизировать свое приложение, zend framework и ваш php-код — хорошее начало (и любые более сложные db-запросы или db-макет в целом). Хорошим началом для понимания того, что такое режим/сопоставление, являются (и для вашего другого комментария) выживания.com/zendframeworkbook/en/1.0 и weierophinney.net/ Мэтью/архивы/ - person Fge; 19.11.2010

Наряду с ответом Fge я считаю, что $resultSet уже должен возвращать значения типа Application_Model_User. Если нет, вам может потребоваться установить $_rowClass в Application_Model_DbTable_User.

person Kevin Schroeder    schedule 18.11.2010
comment
Хм, я основываюсь на быстром запуске Zend Framework, который в fetchAll() в Application_Model_GuestbookMapper также перебирает $resultSet, сопоставляя значения с новой Application_Model_Guestbook. Разве это не лучшие практики, и есть ли более подробный ресурс по картографическим и доменным слоям в ZF, который вы бы порекомендовали? - person Craig; 19.11.2010
comment
Ссылки, размещенные Fge, должны охватывать часть картографа. Все, что я говорю, это то, что модель, в зависимости от используемого механизма выборки, будет автоматически создавать заполненный объект модели. - person Kevin Schroeder; 20.11.2010
comment
Я не уверен на 100%, но я считаю, что вы должны расширить Zend_Db_Table_Row_Abstract, чтобы использовать класс как $_rowClass? Это будет означать, что модель получает информацию о базовой схеме БД, чего пытается избежать шаблон Data Mapper. Но, конечно, вы должны взвесить это против повторения набора результатов только для создания объектов модели... - person Jens Wegar; 04.11.2011