[Zend2] mysql łączenie tabel używając TableGateway

0

W Modue.php mam zdeklarowaną fabrykę:

'HistoryTable' =>  function($sm) 
{
	$tableGateway = $sm->get('HistoryTableGateway');
	$table = new HistoryTable($tableGateway);
	return $table;
},
'HistoryTableGateway' => function ($sm) 
{
	$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
	$resultSetPrototype = new ResultSet();
	$resultSetPrototype->setArrayObjectPrototype(new History());
	return new TableGateway('cases_log', $dbAdapter, null, $resultSetPrototype);
},

Chciałbym za pomocą HistoryTableGateway pobrać z bazy danych informację z 2 tabel:

SELECT L.id AS 'l_id', L.date, L.action, U.id AS 'u_id', U.name, U.surname 
FROM cases_log L, users U 
WHERE L.user = U.id 
LIMIT 0,30 

Póki co udało mi się pobrać dane za pomocą join, tylko że pobiera dane z jednej tablicy:

SELECT * FROM `cases_log` 
JOIN users 
ON users.id = cases_log.user 

Funkcja pobierająca dane w HistoryTable.php:

$table = $this->tableGateway;
$select = $table->getSql()->select();
//$select->from(array('L' => 'cases_log'))->join(array('U' => 'users'),'L.user = U.id');
//$select->columns(array('action', 'surname'));
$select->join('users', 'users.id = cases_log.user');			
$select->limit(10);
$select->offset(0);			
$resultSet = $table->selectWith($select);

return $resultSet;

Jak widać w zakomentowanych liniach próbowałem dostać się jakoś do sekcji SELECT - niestety konstrukcja HistoryTableGateway ustawia $select->from na read only ...

Da się to w ten sposób zrobić ?

0

Spróbuj tak:

$table = $this->tableGateway;
$select = $table->getSql()->select();
$select ->columns(array('action', 'surname'));
$select ->join('users', 'users.id = cases_log.user', array('name', 'surname'), 'left');         
$select->limit(10);
$select->offset(0);            
$resultSet = $table->selectWith($select);
 
return $resultSet;

W join array('name', 'surname') to nazwy kolumn z tabeli users

0

hmm ...

włożyłem to w funkcję fetchFirst() w klasie HistoryTable:

public function fetchFirst()
{
	$table = $this->tableGateway;
	$select = $table->getSql()->select();
	$select ->columns(array('date', 'action'));
	$select ->join('users', 'users.id = cases_log.user', array('name', 'surname'), 'left');         
	$select->limit(10);
	$select->offset(0);            
	$resultSet = $table->selectWith($select);
		 
	return $resultSet;
}

i w kontrolerze w indexAction() wykonuję:

$historyTable = $this->getServiceLocator()->get('HistoryTable');
$viewModel = new ViewModel(array('history' => $historyTable->fetchFirst()));
return $viewModel;

W pliku widoku powstaje błąd: Warning: Invalid argument supplied for foreach();
Wygląda na to że $resultSet jest puste ...

Dodatkowo okazało się, że jest jeszcze jedna relacja do tabeli cases, czyli całe zapytanie w SQL wygląda teraz tak:

 
SELECT L.id AS 'l_id', L.DATE, L.action, U.id AS 'u_id', U.name, U.surname, U.wpis, U.ppis, C.case_name 
FROM cases_log L, users U, cases C 
WHERE (L.user = U.id AND L.caseId=C.id) 
ORDER BY L.date DESC 
LIMIT 0,10 
0

Trzymaj działający wzór z mojego programu:

$dbmiejsceobraz = new \Zend\Db\TableGateway\TableGateway("miejsce_obraz", \Globals::getDBConnection());            
            $select = $dbmiejsceobraz->getSql()->select();            
            $select ->join('miejsce_slownik', 'miejsce_obraz.ID_MIEJSCE=miejsce_slownik.ID_MIEJSCE', array('NAZWA_MIEJSCE'), 'inner');    
            $select->where("miejsce_obraz.ID_OBRAZ=".$id);
            $places = $dbmiejsceobraz->selectWith($select);

1 użytkowników online, w tym zalogowanych: 0, gości: 1