если мне нужно добавить еще условие, мне нужно будет добавить новый метод get ..... со многими параметрами, он плохо читается, имеет дублированное тело.

шаблон 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.

Мой вопрос:

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

Ответы на вопрос(2)

Ваш ответ на вопрос