Я пою шаблон 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;
}
Мне кажется, я следую шаблону сопоставления данных этими методами ...
Теперь проблема:
Я хочу выбрать лиц с каштановыми волосами И моложе 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, и я чувствую, что делаю что-то не так, поэтому я написал этот вопрос.