/** * 对多行记录集递归查询,并将查询结果组装到记录中 * * @param string $mappingName * @param array $rowset * @param array $enabledLinks */ function assembleRecursionRowset($mappingName, &$rowset, $enabledLinks = null) { $assoclink =& $this->getLink($mappingName); if ($assoclink == false) { return false; } $assoclink->init(); $tdg =& $assoclink->assocTDG; $arowset = array(); foreach (array_keys($rowset) as $offset) { $arowset[] =& $rowset[$offset][$mappingName]; } $keys = array_keys($arowset); if (!is_array($enabledLinks)) { if ($enabledLinks == null) { $enabledLinks = array_keys($tdg->links); } else { $enabledLinks = explode(',', $enabledLinks); array_walk($enabledLinks, 'trim'); $enabledLinks = array_filter($enabledLinks, 'strlen'); } } $enabledLinks = array_flip($enabledLinks); $enabledLinks = array_change_key_case($enabledLinks, CASE_LOWER); $this->enableLinks(array_keys($enabledLinks)); foreach ($tdg->links as $link) { /* @var $link FLEA_Db_TableLink */ if (!$link->enabled || !$link->linkRead || !isset($enabledLinks[$link->mappingName])) { continue; } $in = array(); $assocRowset = array(); switch ($assoclink->type) { case HAS_ONE: case BELONGS_TO: foreach ($keys as $key) { $pkv = $arowset[$key][$link->mainTDG->primaryKey]; $in[] = $pkv; $assocRowset[$pkv] =& $arowset[$key]; $arowset[$key][$link->mappingName] = null; } break; case HAS_MANY: case MANY_TO_MANY: foreach ($keys as $key) { foreach (array_keys($arowset[$key]) as $offset) { $pkv = $arowset[$key][$offset][$link->mainTDG->primaryKey]; $in[] = $pkv; $assocRowset[$pkv] =& $arowset[$key][$offset]; $arow[$key][$offset][$link->mappingName] = null; } } } $in = 'IN (' . implode(',', array_map(array(&$this->dbo, 'qstr'), $in)) . ')'; $sql = $link->getFindSQL($in); $this->dbo->assemble($sql, $assocRowset, $link->mappingName, $link->oneToOne, $link->mainTDG->pka, $link->limit); } return true; }