In my Mapper class I'm extending AbstractDbMapper from ZfcBase to fetch rows from the database. A simple example would be code like this:
class MyMapper extends AbstractDbMapper
{
//...
public function fetchAll() {
$select = $this->getSelect();
return $this->select($select); // returns HydratingResultSet
}
}
The problem is that $this->select() returns a Zend\Db\ResultSet\HydratingResultSet (containing the needed and hydrated objects). But I would like to return an array of these objects instead of a HydratingResultSet containing the objects.
The first thing to look at would be HydratingResultSet::toArray() but this returns a multidimensional array instead of an array of objects.
So I chose to do it by hand:
public function fetchAll() {
$select = $this->getSelect();
$results = array();
foreach ($this->select($select) as $object) {
$results[] = $object;
}
return $results; // returns array of needed objects
}
This works but looks ugly in every fetch method. Do I have to modify the code from select() to get the wanted behavior or is there an easier way?
Btw: Is it even recommended to return an array or convert it like this? Thanks for your help!
Update:
There is a cleaner possibility to do it (by limos from https://stackoverflow.com/a/19266650/1275778). Adapted to my example from above it works like this:
public function fetchAll() {
$select = $this->getSelect();
$results = $this->select($select);
return \Zend\Stdlib\ArrayUtils::iteratorToArray($results); // returns desired array of objects
}
If limos posts his answer here, I will happily accept it.
Old answer:
Since no one could answer my question I tried to implement the cleanest option (to me): extending AbstractDbMapper to add the mentioned functionality. I document it here for anyone looking for a solution:
MyAbstractDbMapper extends AbstractDbMapper
{
/**
* @param Select $select
* @param object|null $entityPrototype
* @param HydratorInterface|null $hydrator
* @return array
*/
protected function select(Select $select, $entityPrototype = null,
HydratorInterface $hydrator = null)
{
$resultSet = parent::select($select, $entityPrototype, $hydrator);
$results = array(); // Array of result objects
foreach ($resultSet as $object) {
$results[] = $object;
}
return $results;
}
}
select() in MyAbstractDbMapper now returns an array of objects instead of HydratingResultSet.
As this is getting downvoted, could someone please explain why?
usually you've already got the object class anyway so just popupate instances of your object (class):
public function fetchById($id) {
[...]
$resultSet = $this->getDbTable()->fetchAll($select);
$entries = array();
foreach ($resultSet as $row) {
$entries[] = $this->populate($row);
}
return $entries;
}
and the populate function could look something like this:
private function populate($row)
{
$entry = new Application_Model_YourModel();
$entry->setId($row->id);
[...] //set other object values
return $entry;
}
This will return an array of objects
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With