Пример #1
0
 /**
  * 对多行记录集递归查询,并将查询结果组装到记录中
  *
  * @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;
 }