Using Zend Framework 2, we set up our getServiceConfig()
in our Module.php
such that we have something similar to
public function getServiceConfig()
{
return array(
'factories' => array(
'Application\Model\StudiesTable' => function($sm) {
$tableGateway = $sm->get('StudiesTableGateway');
$table = new StudiesTable($tableGateway);
return $table;
},
'StudiesTableGateway' => function ($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Study());
return new TableGateway('studies', $dbAdapter, null, $resultSetPrototype);
},
//...
}
Then when retrieving items from the database, we'll use it or others like:
public function getSessionsByParticipant($pId)
{
$select = new Select;
$select->from('studySessions')->join("participantsToSessions",
'studySessions.id = participantsToSessions.studySessionsId'
)->where(array("participantsToSessions.participantId" => $pId)
);
$adapter = $this->tableGateway->getAdapter();
$sgateway = new TableGateway('studySessions', $adapter);
return $sgateway->selectWith($select);
}
This is fine for single table operations, because the table generally maps to the model class like Participant
or a class like Session
. Classes like that in our Model/
directory have their public members that are filled by Zend and they're easy to access and work with.
With a JOIN, however, I don't have a good strategy for populating variables. This has resulted in awkward classes like Participant
having private members that are really just there so that they can be filled on a particular join, but don't have to deal with a Participant
otherwise.
Is there a better way to do this such that when joining tables, I can still get the columns I need without awkwardly adding them to, say, the model class?
Thanks in advance