Пример #1
0
 /**
  * 自动查询关联的资料
  * @param mixed 封装好的查询结果
  * @return mixed
  */
 private function _autoSelectFieldAssociated($info)
 {
     $tableName = null;
     //一条资料
     if ($info instanceof XF_Db_Table_Abstract) {
         $tep = $this->_readAutoSelectFieldAssociated($info);
         if (XF_Functions::isEmpty($tep)) {
             return $info;
         }
         foreach ($tep as $key => $val) {
             $assName = array_keys($val);
             $tmp = $info->selectAssociated($assName[0]);
             if ($val[$assName[0]]['oneToMany'] == true) {
                 if (is_array($tmp)) {
                     foreach ($tmp as $t) {
                         $fields = explode(',', $val[$assName[0]]['field']);
                         if (count($fields) > 1) {
                             foreach ($fields as $f) {
                                 if (strpos($f, ':') === 0) {
                                     $f = str_replace(':', '', $f);
                                     $fvs = explode(',', $info->{$f});
                                     foreach ($fvs as $_fvs) {
                                         if ($_fvs == $t->{$val[$assName[0]]['associateField']}) {
                                             $info->{$assName[0] . '_' . $f . '_all_data_count'} += 1;
                                             $count = is_array($info->{$assName[0] . '_' . $f}) ? count($info->{$assName[0] . '_' . $f}) : 0;
                                             if ($count < $val[$assName[0]]['size']) {
                                                 $info->{$assName[0] . '_' . $f . '[]'} = $t;
                                             }
                                         }
                                     }
                                 } else {
                                     if ($info->{$f} == $t->{$val[$assName[0]]['associateField']}) {
                                         $info->{$assName[0] . '_' . $f . '_all_data_count'} += 1;
                                         $count = is_array($info->{$assName[0] . '_' . $f}) ? count($info->{$assName[0] . '_' . $f}) : 0;
                                         if ($count < $val[$assName[0]]['size']) {
                                             $info->{$assName[0] . '_' . $f . '[]'} = $t;
                                         }
                                     }
                                 }
                             }
                         } else {
                             $info->{$assName[0] . '_all_data_count'} += 1;
                             $count = is_array($info->{$assName[0]}) ? count($info->{$assName[0]}) : 0;
                             if ($count < $val[$assName[0]]['size']) {
                                 $info->{$assName[0] . '[]'} = $t;
                             }
                         }
                     }
                 }
             }
             if (strpos($val[$assName[0]]['field'], ',') !== false) {
                 $fields = explode(',', $val[$assName[0]]['field']);
                 if (is_array($tmp)) {
                     foreach ($tmp as $t) {
                         foreach ($fields as $f) {
                             if (strpos($f, ':') === 0) {
                                 $f = str_replace(':', '', $f);
                                 $fvs = explode(',', $info->{$f});
                                 foreach ($fvs as $_fvs) {
                                     if ($_fvs == $t->{$val[$assName[0]]['associateField']}) {
                                         $info->{$assName[0] . '_' . $f . '[]'} = $t;
                                     }
                                 }
                             } else {
                                 if ($info->{$f} == $t->{$val[$assName[0]]['associateField']}) {
                                     $info->{$assName[0] . '_' . $f} = $t;
                                 }
                             }
                         }
                     }
                 }
             } else {
                 $info->{$assName[0]} = $tmp;
             }
         }
     } elseif (is_array($info)) {
         $fieldValues = array();
         $allSelectFieldAssociate = array();
         //按关联的表名组合将要查询的条件值
         foreach ($info as $k => $v) {
             $tep = $this->_readAutoSelectFieldAssociated($v);
             if (XF_Functions::isEmpty($tep)) {
                 return $info;
             }
             $allSelectFieldAssociate[$k] = $tep;
             //分析要查询关联值
             foreach ($tep as $kk => $vv) {
                 $assName = array_keys($vv);
                 //去重复的值
                 $values = @$fieldValues[$vv[$assName[0]]['table']][$assName[0]][$vv[$assName[0]]['associateField']]['data'];
                 $tmpFields = explode(',', $vv[$assName[0]]['field']);
                 foreach ($tmpFields as $field) {
                     //字段第一位字符是否为':'符号,该符号表示当前这个字段值是一个"数组"。例:34,531,98,1,409
                     if (strpos($field, ':') === 0) {
                         $field = str_replace(':', '', $field);
                         $infoValues = explode(',', $v->{$field});
                         foreach ($infoValues as $infoValue) {
                             if ($infoValue != '' || $infoValue == '0') {
                                 $values[$infoValue] = $infoValue;
                             }
                         }
                     } else {
                         $infoValue = $v->{$field};
                         if ($infoValue != '' || $infoValue == '0') {
                             $values[$infoValue] = $infoValue;
                         }
                     }
                 }
                 if ($values != null) {
                     $fieldValues[$vv[$assName[0]]['table']][$assName[0]][$vv[$assName[0]]['associateField']]['data'] = $values;
                     $fieldValues[$vv[$assName[0]]['table']][$assName[0]][$vv[$assName[0]]['associateField']]['_other'] = array('size' => isset($vv[$assName[0]]['size']) ? $vv[$assName[0]]['size'] : null, 'where' => isset($vv[$assName[0]]['where']) ? $vv[$assName[0]]['where'] : null, 'order' => isset($vv[$assName[0]]['order']) ? $vv[$assName[0]]['order'] : null, '_field' => isset($vv[$assName[0]]['_field']) && $vv[$assName[0]]['_field'] != '*' ? $vv[$assName[0]]['associateField'] . ',' . $vv[$assName[0]]['_field'] : '*', 'oneToMany' => $vv[$assName[0]]['oneToMany'], 'autoinit' => $this->_db_table->getInitAutoExecuteMethodFromAssociate($assName[0]));
                 }
             }
         }
         $allAssociateInfos = array();
         foreach ($fieldValues as $fk => $fv) {
             $table = new $fk();
             /////检测是否需要设置当前关联对象自己的关联状态
             $objectAssting = $this->_db_table->getFieldAssociateObjectAssSetting();
             $_ass = $this->_db_table->getFieldAssociated();
             if (is_array($_ass) && count($_ass) > 0) {
                 foreach ($_ass as $_k => $_val) {
                     if (isset($objectAssting[$_k])) {
                         $matchAssting = $objectAssting[$_k];
                         foreach ($matchAssting as $mk => $mval) {
                             if (get_class($table) == $mval['assObjectName']) {
                                 if ($mval['autoAssociated'] == true) {
                                     if (!empty($mval['where'])) {
                                         $table->setAssociatedAuto($mk, $mval['size'], $mval['where'], $mval['order'], $mval['_field']);
                                     } else {
                                         $table->setAssociatedAutoOnly($mk, $mval['size'], $mval['_field']);
                                     }
                                 } elseif (!empty($mval['where'])) {
                                     $table->setAssociatedManual($mk, $mval['size'], $mval['where'], $mval['order'], $mval['_field']);
                                 } else {
                                     $table->setAssociatedManualOnly($mk, $mval['size'], $mval['_field']);
                                 }
                             }
                         }
                     }
                 }
             }
             foreach ($fv as $assName => $rule) {
                 foreach ($rule as $field => $v) {
                     ///设置关联对象的init
                     if (is_array($v['_other']['autoinit'])) {
                         foreach ($v['_other']['autoinit'] as $m) {
                             if ($m['params'] !== NULL) {
                                 array_unshift($m['params'], $m['method'], NULL);
                                 call_user_func_array(array($table, 'addInitAutoExecuteMethod'), $m['params']);
                             } else {
                                 $table->addInitAutoExecuteMethod($m['method']);
                             }
                         }
                     }
                     $select = $table->getTableSelect();
                     $select->setFindField($v['_other']['_field'])->setWhere($v['_other']['where'])->setWhereIn($field, array_values($v['data']))->setOrder($v['_other']['order'])->setLimit(false);
                     $sql = $select->getSql();
                     //是否为一对一查询 IN条件查询的每个值对应的查询结果可能是多条,所以需要再次分组
                     if ($v['_other']['oneToMany'] !== true) {
                         $sql = "SELECT * FROM({$sql}) AS XF_NewTable GROUP BY {$field}";
                     }
                     //主查询是否已缓存
                     if ($this->_data_cache_time > 0 && $this->_cache_class instanceof XF_Cache_Interface) {
                         $select->setCacheClass($this->_cache_class)->setCacheTime($this->_data_cache_time);
                     }
                     $rs = $select->execute($sql, true);
                     $allAssociateInfos[$fk . '=>' . $assName . '=>' . $field . ''] = $rs;
                 }
             }
         }
         //组合资料
         foreach ($info as $info_k => $info_v) {
             foreach ($allAssociateInfos as $assInfo_k => $assInfo_v) {
                 $assInfo_ks = explode('=>', $assInfo_k);
                 if (is_array($assInfo_v)) {
                     ////获取当前表对象所有的关联设置
                     $associateAllConfig = $info_v->getFieldAssociated();
                     foreach ($associateAllConfig as $assConfig_k => $assConfig_v) {
                         if ($assConfig_v['table'] . '=>' . $assConfig_v['associateField'] == $assInfo_ks[0] . '=>' . $assInfo_ks[2] && $assConfig_k == $assInfo_ks[1]) {
                             //字段列表
                             $fields = explode(',', $assConfig_v['field']);
                             foreach ($assInfo_v as $assInfo_vv) {
                                 foreach ($fields as $field) {
                                     //该字段值是否为一个"数组"。例:34,531,98,1,409
                                     if (strpos($field, ':') === 0) {
                                         $field = substr($field, 1);
                                         $fieldValues = explode(',', $info_v->{$field});
                                         foreach ($fieldValues as $fieldValue) {
                                             if ($fieldValue == $assInfo_vv->{$assConfig_v['associateField']}) {
                                                 if (count($fields) > 1) {
                                                     if ($assConfig_v['oneToMany'] == true) {
                                                         //一对多时,记录总数
                                                         $info[$info_k]->{$assConfig_k . '_all_data_count'} += 1;
                                                         $_count = is_array($info[$info_k]->{$assConfig_k . '_' . $field}) ? count($info[$info_k]->{$assConfig_k . '_' . $field}) : 0;
                                                         if ($_count < $assConfig_v['size'] || $assConfig_v['size'] == FALSE) {
                                                             $info[$info_k]->{$assConfig_k . '_' . $field . '[]'} = $assInfo_vv;
                                                         }
                                                     } else {
                                                         $info[$info_k]->{$assConfig_k . '_' . $field} = $assInfo_vv;
                                                     }
                                                 } else {
                                                     if ($assConfig_v['oneToMany'] == true) {
                                                         //一对多时,记录总数
                                                         $info[$info_k]->{$assConfig_k . '_all_data_count'} += 1;
                                                         $_count = is_array($info[$info_k]->{$assConfig_k}) ? count($info[$info_k]->{$assConfig_k}) : 0;
                                                         if ($_count < $assConfig_v['size'] || $assConfig_v['size'] == FALSE) {
                                                             $info[$info_k]->{$assConfig_k . '[]'} = $assInfo_vv;
                                                         }
                                                     } else {
                                                         $info[$info_k]->{$assConfig_k} = $assInfo_vv;
                                                     }
                                                 }
                                             }
                                         }
                                     } elseif ($info_v->{$field} == $assInfo_vv->{$assConfig_v['associateField']}) {
                                         if (count($fields) > 1) {
                                             if ($assConfig_v['oneToMany'] == true) {
                                                 //一对多时,记录总数
                                                 $info[$info_k]->{$assConfig_k . '_all_data_count'} += 1;
                                                 $_count = is_array($info[$info_k]->{$assConfig_k . '_' . $field}) ? count($info[$info_k]->{$assConfig_k . '_' . $field}) : 0;
                                                 if ($_count < $assConfig_v['size'] || $assConfig_v['size'] == FALSE) {
                                                     $info[$info_k]->{$assConfig_k . '_' . $field . '[]'} = $assInfo_vv;
                                                 }
                                             } else {
                                                 $info[$info_k]->{$assConfig_k . '_' . $field} = $assInfo_vv;
                                             }
                                         } else {
                                             if ($assConfig_v['oneToMany'] == true) {
                                                 //一对多时,记录总数
                                                 $info[$info_k]->{$assConfig_k . '_all_data_count'} += 1;
                                                 $_count = is_array($info[$info_k]->{$assConfig_k}) ? count($info[$info_k]->{$assConfig_k}) : 0;
                                                 if ($_count < $assConfig_v['size'] || $assConfig_v['size'] == FALSE) {
                                                     $info[$info_k]->{$assConfig_k . '[]'} = $assInfo_vv;
                                                 }
                                             } else {
                                                 $info[$info_k]->{$assConfig_k} = $assInfo_vv;
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
     return $info;
 }