/** * 自动查询关联的资料 * @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; }