setWebsite(__NAMESPACE__); $this->isLoginJson(); } } public function showColumnList(Request $request) { $mid = $request->post('mid'); $id = $request->post('id'); if (empty($mid) && empty($id)) { return responseMessage(2001, '参数错误!'); } if ($id) { $infoObj = DB::table('sys_assemble')->find($id); } else { $infoObj = DB::table('sys_assemble')->where('mid', $mid)->first(); } if (empty($infoObj)) { return responseMessage(2002, '参数错误!'); } $listObj = DB::table($this->tableAssembleColumn)->where('is_delete', 0)->where('assemble_id', $infoObj->id)->get(); $list = array_map('get_object_vars', $listObj->toArray()); return responseMessage(1002, '', $list); } /** * @param ColumnForm $request * @return JsonResponse */ public function save(ColumnForm $request) { $column_id = $request->post('id'); $assemble_mid = $request->post('assemble_mid'); // 获取集合信息 if (PHP_SAPI == 'cli') { $assemble_id = $request->post('assemble_id'); if (empty($assemble_id)) { return responseMessage(2000, '参数错误!'); } $assembleInfo = DB::table($this->tableAssemble)->find($assemble_id); } else { $assembleInfo = DB::table($this->tableAssemble)->where('mid', $assemble_mid)->first(); } if (empty($assembleInfo)) { return responseMessage(2001, '参数错误,集合不存在!'); } // 清除缓存 $assemble = new Assemble($assembleInfo->schema); $assemble->clearColumnsCache(); $type = $request->post('type'); $code = $request->post('code'); $length = $request->post('length'); $decimal = $request->post('decimal'); $is_null = $request->post('is_null'); $default = $request->post('default'); $remark = $request->post('remark'); $assemble_id = $assembleInfo->id; $tableName = $request->post('table'); $length = intval($length); $is_null = intval($is_null); $requestData = [ 'mid' => getRandNumber(), 'assemble_id' => $assemble_id, 'title' => $request->post('title'), 'code' => $code, 'type' => $type, 'length' => $length, 'decimal' => $decimal, 'is_null' => $is_null, //是否可以为空 1是 0否 'default' => $default, 'remark' => $remark, 'weight' => $request->post('weight'), 'is_delete' => 0, 'created_at' => time(), 'updated_at' => time(), ]; return $this->saveTableColumn($requestData, $assembleInfo->schema, $column_id); } /** * 获取字段信息 * * @param Request $request * @return JsonResponse */ public function getColumnInfo(Request $request) { $id = $request->post('column_id'); if (empty($id)) { return responseMessage(2001, '参数错误!'); } $columnInfo = DB::table($this->tableAssembleColumn)->find($id); $columnAr = get_object_vars($columnInfo); // 表名的前缀去掉 $table = $columnAr['table']; $arr = explode('_', $table, 2); $columnAr['table'] = $arr[1]; return responseMessage(1002, '', $columnAr); } ###################################################################### /** * 获取系统字段 * * @param Request $request * @return JsonResponse */ public function getSysColumnList(Request $request) { $page = $request->post('page', 1); $size = $request->post('size', 30); $keyword = $request->post('keyword'); $find = DB::table($this->tableAssembleColumn) ->where('is_delete', 0) ->where('category_type', '<>', 1); if ($keyword) { $find->where('code', 'like', '%' . $keyword . '%'); } $list = $find->offset(($page - 1) * $size)->limit($size)->get(); $total = $find->count(); return responseMessage(1002, '', ['list' => $list, 'total' => $total]); } /** * 创建 * * @param Request $request * @return JsonResponse */ public function createColumnBySys(Request $request) { $assemble_id = $request->post('assemble_id'); $column_id = $request->post('column_id'); if (empty($assemble_id) || empty($column_id)) { return responseMessage(2001, '参数错误!'); } // 获取集合信息 $assembleInfoObj = DB::table($this->tableAssemble)->find($assemble_id); if (empty($assembleInfoObj)) { return responseMessage(2002, '参数错误!'); } $infoObj = DB::table($this->tableAssembleColumn)->find($column_id); if (empty($infoObj)) { return responseMessage(2003, '参数错误!'); } $info = get_object_vars($infoObj); unset($info['id']); unset($info['mid']); unset($info['created_at']); unset($info['updated_at']); $columnAssembleInfoObj = DB::table($this->tableAssemble)->find($info['assemble_id']); $category_type = $info['category_type']; $tableName = Str::replaceFirst($columnAssembleInfoObj->schema, '', $info['table']); $tableName = trim($tableName, '_'); $requestData = [ 'mid' => getRandNumber(), 'assemble_id' => $assemble_id, 'category_type' => $category_type, 'weight' => 0, 'is_delete' => 0, ]; return $this->saveTableColumn(array_merge($info, $requestData), $assembleInfoObj->schema); } /** * 添加或修改表字段 * * @param array $request * @param string $entityTable * @param int|null $id * @return JsonResponse */ private function saveTableColumn(array $request, string $entityTable, ?int $id = null): JsonResponse { if ($id) { // 获取当前的字段信息 $columnInfo = DB::table($this->tableAssembleColumn)->find($id); if (empty($columnInfo)) { return responseMessage(2005, '该字段不存在,或已经删除'); } $currentCode = $columnInfo->code; $code = $request['code']; Schema::table($entityTable, function (Blueprint $table) use ($currentCode, $code, $request, $entityTable) { $request['code'] = $currentCode; $this->createColumn('update', $entityTable, $request, $table); if ($currentCode != $code) { $table->renameColumn($currentCode, $code); } }); $request['code'] = $code; return $this->saveToDb('update', $request, $entityTable, $id); } else { Schema::table($entityTable, function (Blueprint $table) use ($request, $entityTable) { $this->createColumn('add', $entityTable, $request, $table); }); return $this->saveToDb('add', $request, $entityTable); } } /** * @param $requestType * @param $columnData * @param $columnTableName * @param string $id * @return JsonResponse */ private function saveToDb($requestType, $columnData, $columnTableName, $id = '') { $assemble_id = $columnData['assemble_id']; $code = $columnData['code']; if ($requestType == 'update') { // 判断是否已经存在 $isExist = DB::table($this->tableAssembleColumn)->where('assemble_id', $assemble_id)->where('code', $code)->where('id', '<>', $id)->count(); if ($isExist) { return responseMessage(2006, '该字段已经存在,不允许重复添加!'); } $isSuccess = DB::table($this->tableAssembleColumn)->where('id', $id)->update($columnData); $str = '修改'; } else { // 判断是否已经存在 $isExist = DB::table($this->tableAssembleColumn)->where('assemble_id', $assemble_id)->where('code', $code)->count(); if ($isExist) { return responseMessage(2006, '该字段已经存在,不允许重复添加!'); } $isSuccess = DB::table($this->tableAssembleColumn)->insert($columnData); $str = '添加'; } if ($isSuccess) { if (!Schema::hasTable($columnTableName)) { Schema::create($columnTableName, function (Blueprint $query) use ($columnTableName, $columnData, $requestType) { $query->id('id')->comment('编号'); $query->bigInteger('entity_id')->comment('实体id'); $query->bigInteger('column_id')->default(0)->comment('字段id'); $this->createColumn($requestType, $columnTableName, $columnData, $query, true); }); } return responseMessage(1001, '字段' . $str . '成功!'); } else { return responseMessage(2007, '字段' . $str . '失败,请重试!'); } } /** * @param string $requestType * @param string $columnTableName * @param array $requestData * @param Blueprint $query * @param bool $isExtend */ private function createColumn(string $requestType, string $columnTableName, array $requestData, Blueprint $query, bool $isExtend = false) { if ($isExtend) { $code = 'value'; } else { $code = $requestData['code']; } $type = $requestData['type']; $length = $requestData['length']; $decimal = $requestData['decimal']; $is_null = $requestData['is_null']; $default = $requestData['default']; $remark = $requestData['remark']; $columnService = new ColumnsService($requestData['assemble_id']); $type = strtolower($type); $function = $columnService->getColumnFn($type); // 获取类型 if (in_array($function, ['char', 'varchar', 'string'])) { $obj = $query->$function($code, $length); } elseif (in_array($function, ['float', 'double', 'decimal'])) { $obj = $query->$function($code, $length ?: 8, $decimal ?: 2); } else { $obj = $query->$function($code); } if ($default || $default === 0) { $obj->default($default); // 设置默认值 } if ($is_null) { $obj->nullable(); // 是否为空 } if ($remark) { $obj->comment($remark); // 注释 } if ($requestType == 'update') { // 修改 $isExist = Schema::hasColumn($columnTableName, $code); if ($isExist) { // 判断该字段是否已经存在,不存在则添加 $obj->change(); } } } }