/** +---------------------------------------------------------- * 更新一个数据对象 +---------------------------------------------------------- * @access protected +---------------------------------------------------------- * @param Model $model 数据对象 +---------------------------------------------------------- * @return void +---------------------------------------------------------- * @throws ThinkExecption +---------------------------------------------------------- */ protected function _update($model) { $vo = $model->create('', 'edit'); if (!$vo) { $this->error($model->getError()); } $id = is_array($vo) ? $vo[$model->getPk()] : $vo->{$model->getPk()}; $guid = $model->getModelName() . '_' . $id; if (S($guid) == $vo) { $this->error(L('无需更新!')); } $result = $model->save($vo); if ($result) { $vo = $model->getById($id); // 保存成功,更新缓存Vo对象 S($guid, $vo); //数据保存触发器 if (method_exists($this, '_trigger')) { $this->_trigger($vo); } if (!empty($_FILES)) { //如果有文件上传 //执行默认上传操作 //保存附件信息到数据库 $this->_upload(MODULE_NAME, $id); } //成功提示 $this->success(L('_UPDATE_SUCCESS_')); } else { //错误提示 $this->error($model->getError()); } }
/** * 获取返回数据的关联记录 * @access protected * @param mixed $result 返回数据 * @param string|array $name 关联名称 * @param boolean $return 是否返回关联数据本身 * @return array */ protected function getRelation(&$result, $name = '', $return = false) { if (!empty($this->link)) { foreach ($this->link as $key => $val) { $mappingName = !empty($val['mapping_name']) ? $val['mapping_name'] : $key; // 映射名称 if (empty($name) || true === $name || $mappingName == $name || is_array($name) && in_array($mappingName, $name)) { $mappingType = !empty($val['mapping_type']) ? $val['mapping_type'] : $val; // 关联类型 $mappingClass = !empty($val['class_name']) ? $val['class_name'] : $key; // 关联类名 $mappingFields = !empty($val['mapping_fields']) ? $val['mapping_fields'] : '*'; // 映射字段 $mappingCondition = !empty($val['condition']) ? $val['condition'] : '1=1'; // 关联条件 $mappingKey = !empty($val['mapping_key']) ? $val['mapping_key'] : $this->getPk(); // 关联键名 if (strtoupper($mappingClass) == strtoupper($this->name)) { // 自引用关联 获取父键名 $mappingFk = !empty($val['parent_key']) ? $val['parent_key'] : 'parent_id'; } else { $mappingFk = !empty($val['foreign_key']) ? $val['foreign_key'] : strtolower($this->name) . '_id'; // 关联外键 } // 获取关联模型对象 $model = new Model($mappingClass); switch ($mappingType) { case HAS_ONE: $pk = $result[$mappingKey]; $mappingCondition .= " AND {$mappingFk}='{$pk}'"; $relationData = $model->where($mappingCondition)->field($mappingFields)->find(); break; case BELONGS_TO: if (strtoupper($mappingClass) == strtoupper($this->name)) { // 自引用关联 获取父键名 $mappingFk = !empty($val['parent_key']) ? $val['parent_key'] : 'parent_id'; } else { $mappingFk = !empty($val['foreign_key']) ? $val['foreign_key'] : strtolower($model->getModelName()) . '_id'; // 关联外键 } $fk = $result[$mappingFk]; $mappingCondition .= " AND {$model->getPk()}='{$fk}'"; $relationData = $model->where($mappingCondition)->field($mappingFields)->find(); break; case HAS_MANY: $pk = $result[$mappingKey]; $mappingCondition .= " AND {$mappingFk}='{$pk}'"; $mappingOrder = !empty($val['mapping_order']) ? $val['mapping_order'] : ''; $mappingLimit = !empty($val['mapping_limit']) ? $val['mapping_limit'] : ''; // 延时获取关联记录 $relationData = $model->where($mappingCondition)->field($mappingFields)->order($mappingOrder)->limit($mappingLimit)->select(); break; case MANY_TO_MANY: $pk = $result[$mappingKey]; $mappingCondition = " {$mappingFk}='{$pk}'"; $mappingOrder = $val['mapping_order']; $mappingLimit = $val['mapping_limit']; $mappingRelationFk = $val['relation_foreign_key'] ? $val['relation_foreign_key'] : $model->getModelName() . '_id'; $mappingRelationTable = $val['relation_table'] ? $val['relation_table'] : $this->getRelationTableName($model); $sql = "SELECT b.{$mappingFields} FROM {$mappingRelationTable} AS a, " . $model->getTableName() . " AS b WHERE a.{$mappingRelationFk} = b.{$model->getPk()} AND a.{$mappingCondition}"; if (!empty($val['condition'])) { $sql .= ' AND ' . $val['condition']; } if (!empty($mappingOrder)) { $sql .= ' ORDER BY ' . $mappingOrder; } if (!empty($mappingLimit)) { $sql .= ' LIMIT ' . $mappingLimit; } $relationData = $this->query($sql); break; } if (!$return) { if (isset($val['as_fields']) && in_array($mappingType, [HAS_ONE, BELONGS_TO])) { // 支持直接把关联的字段值映射成数据对象中的某个字段 // 仅仅支持HAS_ONE BELONGS_TO $fields = explode(',', $val['as_fields']); foreach ($fields as $field) { if (strpos($field, ':')) { list($relationName, $nick) = explode(':', $field); $result[$nick] = $relationData[$relationName]; } else { $result[$field] = $relationData[$field]; } } } else { $result[$mappingName] = $relationData; } unset($relationData); } else { return $relationData; } } } } return $result; }