Шаблон Data Mapper: сложный запрос из уровня сервиса

Я пою шаблон Data Mapper в Zend Framework. Пока это работает хорошо, но теперь я дошел до того, что мне нужна ваша помощь / мнение. Итак, начнем с кода:

У нас есть таблица с несколькими людьми:

CREATE TABLE `persons` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `age` int(3) NOT NULL,
  `haircolor` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id``),
);

Теперь я пытаюсь выбрать всех людей с каштановыми волосами. Я использую следующий метод в ServiceLayer

public function getPeopleByHaircolor($hair) {
  return $this->getMapper()->fetch('haircolor = ?', $hair);
}

. Метод в Mapper выглядит так:

public function fetch($condition, $value) {
  $resultSet = $this->getTable()->fetchAll($this->getTable()->select()->where($cond, $value));
  $entries = array();

  foreach($resultSet as $row) {
    $entry = new Default_Model_Person();
    $entry->id   = $row->id;
    $entry->name = $row->name;
    [...]
  }
  return $entries;
}

Я думаю, что следую шаблону Data Mapper с этими методами ...


Теперь проблема:

Я хочу выберите Лица с каштановыми волосами И младше 20 лет. Так как я могу это сделать? Моя попытка:

public function getTeens($hair) {
  $rows = $this->getMapper()->fetch('haircolor = ?', $hair);
  $return = array();
  foreach($rows as $row) {
    if((int)$row->age < 20) $return[] = $row;
  }
  return $return;
}

Но если вы получите больше переменных, таких как «люди с каштановыми волосами, моложе 20 лет и с именем« Foo Bar »», мне потребуется все больше и больше методов и / или циклов foreach.


Мой вопрос :

Как бы вы это сделали в шаблоне отображения данных? Если я выполняю собственный SQL-запрос, например $ serviceLayer-> mapper-> table-> qry ('SELECT ...'), нарушает ли это шаблон Data Mapper? Мне не нравятся эти дополнительные циклы foreach, и мне кажется, что я делаю что-то не так, поэтому я написал этот вопрос.

7
задан Brian Tompsett - 汤莱恩 26 December 2015 в 12:02
поделиться