Я знаю, что этот ответ приходит немного поздно, но вот некоторые вещи, на которые следует обратить внимание.
1) findManyToManyRowset($matchTable, $intersectionTable, $callerRefRule, $matchRefRule, $select);
- если вы передаете Zend_Db_Table_Select
, вы захотите передать null
для правил.
2) Zend_Db_Table_Select
, переданный в findManyToManyRowset()
, должен быть создан из $matchTable
, и можно с уверенностью предположить, что в выражениях where i
является псевдонимом для таблицы пересечений, а m
является псевдоним таблицы совпадений.
3) В случае коллизий m
получит имя ключа в ассоциативном массиве, возвращаемом в php. Выполненный запрос выглядит так:
SELECT
`i`.*, `m`.*
FROM
`interscetTable` AS `i`
INNER JOIN
`matchTable` AS `m`
ON
`i`.`fk_m` = `m`.`pk` WHERE (`i`.`fk_o` = ?)
4) Независимо от того, что возвращаемое значение findManyToManyRowset()
будет набором строк, созданным из $matchTable
, поэтому, если вам нужно получить какую-либо информацию из пересекающейся таблицы, а также захватить данные для таблицы соответствия, вам, вероятно, понадобится пользовательский Zend_Db_Select
и избегайте использования Zend_Db_Table
для отображения данных в любом случае.
Итак, рабочий пример, использующий «People» в качестве таблицы соответствия, «Workers» в качестве таблицы пересечения и позволяющий сказать «Clients» в качестве исходной таблицы. Предположим, что таблицы связывают воедино что-то вроде:
Люди. id:...
-> рабочие. person_id:client_id:job_id
-> клиенты: id:...
$client = $clientTable->fetchRow(); /// grab a random client
// fetch all people that have worked for the client ordered by their last name.
$client->findManyToManyRowset("People", "Workers", null, null,
$peopleTable->select()->order('m.lastname'));
// fetch all people that have worked for the client ordered by their hire date:
// `workers`.`hiredate`
$client->findManyToManyRowset("People", "Workers", null, null,
$peopleTable->select()->order('i.hiredate'));