Patrón del mapeador de datos: consulta Complexe de la capa de servicio

Estoy cantando el patrón del mapeador de datos en Zend Framework. Esto funciona bien hasta ahora, pero ahora llegué a un punto en el que necesito su ayuda / opinión. Entonces, comencemos con el Código:

Tenemos una mesa con varias personas:

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``),
);

Ahora trato de seleccionar a todas las personas que tienen cabello castaño. Utilizo el siguiente método en ServiceLayer

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

El método en el Mapper se ve así:

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;
}

Creo que sigo el patrón del mapeador de datos con estos métodos ...

Ahora el problema:

Quiero seleccionar Personas, que tengan cabello castaño Y que sean menores de 20 años. Entonces, ¿cómo puedo hacer eso? Mi intento:

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;
}

Pero si obtienes más variables, como "personas con cabello castaño, menores de 20 años y con el nombre 'Foo Bar'", necesito más y más métodos y / o bucles foreach.

Mi pregunta

¿Cómo harías esto en el patrón del mapeador de datos? Si hago una consulta SQL nativa como $ serviceLayer-> mapper-> table-> qry ('SELECT ...'), ¿esto está rompiendo el patrón del mapeador de datos? No me gustan esos bucles foreach adicionales y parece que estoy haciendo algo mal, así que escribí esta pregunta.

Respuestas a la pregunta(2)

Su respuesta a la pregunta