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.