W mojej klasie Mappera rozszerzam AbstractDbMapper
z ZfcBase
, aby pobrać wiersze z bazy danych. Prostym przykładem jest kodu:Konwertuj Zend Db ResultSet HydratingResultSet do tablicy obiektów
class MyMapper extends AbstractDbMapper
{
//...
public function fetchAll() {
$select = $this->getSelect();
return $this->select($select); // returns HydratingResultSet
}
}
Problemem jest to, że $this->select()
zwraca Zend\Db\ResultSet\HydratingResultSet
(zawierający potrzebne i uwodnione obiektów). Ale chciałbym zwrócić tablicę tych obiektów zamiast HydratingResultSet
zawierających obiekty.
Pierwszą rzeczą, na którą należy spojrzeć, byłby HydratingResultSet::toArray()
, ale to zwraca tablicę wielowymiarową zamiast tablicy obiektów.
Więc wybrałem to zrobić ręcznie:
public function fetchAll() {
$select = $this->getSelect();
$results = array();
foreach ($this->select($select) as $object) {
$results[] = $object;
}
return $results; // returns array of needed objects
}
To działa, ale wygląda brzydko w każdym sprowadzić metodę. Czy muszę zmodyfikować kod z select(), aby uzyskać pożądane zachowanie, czy jest łatwiejszy sposób?
Przy okazji: Czy jest nawet zalecane zwrócić tablicę lub przekonwertować ją w ten sposób? Dzięki za pomoc!
Czy istnieje powód, dla którego potrzebujesz tablicy? Zestaw wyników będzie działał jak iterator i będzie można go używać w większości przypadków. Nie ma wbudowanej metody, aby uzyskać tablicę bez robienia tego, co teraz robisz, możesz dodać tę metodę do swojego programu Mapper lub po prostu Hydrator jako skrót. – Andrew
Używam tych wyników w moim kontrolerze i myślę, że byłoby bardziej czysto pracować z tablicami zamiast z niektórymi obiektami Zend \ Db. Nie rozumiem, dlaczego zdecydowali się to zrobić w ten sposób ... – lorey
zdecydowali się to zrobić w ten sposób, ponieważ otrzymaliście dodatkową funkcjonalność, taką jak buforowanie zestawu wyników itp. Pomyśl o tym, czy masz kolekcję obiektów 9 milionów, tablica stanie się OGROMNA i zużyje pamięć RAM, dzięki tej kolekcji elementy zostaną wykonane na żądanie, jeden po drugim, jest znacznie bardziej wydajny. – Andrew