EntityFieldController::listUpdate()   A
last analyzed

Complexity

Conditions 3
Paths 4

Size

Total Lines 20
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 15
nc 4
nop 2
dl 0
loc 20
rs 9.7666
c 0
b 0
f 0
1
<?php
2
/**
3
 * @author  Eddy <[email protected]>
4
 */
5
6
namespace App\Http\Controllers\Admin;
7
8
use App\Http\Controllers\Controller;
9
use App\Http\Requests\Admin\EntityFieldRequest;
10
use App\Model\Admin\Entity;
11
use App\Model\Admin\EntityField;
12
use App\Repository\Admin\EntityFieldRepository;
13
use App\Repository\Admin\EntityRepository;
14
use Illuminate\Database\Eloquent\ModelNotFoundException;
15
use Illuminate\Database\QueryException;
16
use Illuminate\Database\Schema\Blueprint;
17
use Illuminate\Http\Request;
18
use Illuminate\Support\Str;
19
use Illuminate\View\View;
20
use Illuminate\Support\Facades\Schema;
21
use Illuminate\Support\Facades\Log;
22
23
class EntityFieldController extends Controller
24
{
25
    protected $formNames = [
26
        'name', 'type', 'comment', 'form_name', 'form_type', 'is_show', 'is_edit', 'is_required',
27
        'form_comment', 'entity_id', 'field_length', 'field_total', 'field_scale', 'order', 'form_params',
28
        'default_value', 'is_show_inline', 'form_default_value'
29
    ];
30
31
    public function __construct()
32
    {
33
        parent::__construct();
34
35
        $this->breadcrumb[] = ['title' => '模型字段列表', 'url' => route('admin::entityField.index')];
36
    }
37
38
    /**
39
     * 模型字段管理-模型字段列表
40
     *
41
     */
42
    public function index()
43
    {
44
        $this->breadcrumb[] = ['title' => '模型字段列表', 'url' => ''];
45
        EntityField::$searchField['entity_id']['enums'] = EntityRepository::all()->pluck('name', 'id');
46
        return view('admin.entityField.index', ['breadcrumb' => $this->breadcrumb]);
47
    }
48
49
    /**
50
     * 模型字段管理-模型字段列表数据接口
51
     *
52
     * @param Request $request
53
     * @return array
54
     */
55
    public function list(Request $request)
56
    {
57
        $perPage = (int) $request->get('limit', 50);
58
        $this->formNames[] = 'created_at';
59
        $condition = $request->only($this->formNames);
60
61
        $data = EntityFieldRepository::list($perPage, $condition);
62
63
        return $data;
64
    }
65
66
    /**
67
     * 模型字段管理-新增模型字段
68
     *
69
     */
70
    public function create()
71
    {
72
        $entity = Entity::query()->pluck('name', 'id')->all();
73
        $this->breadcrumb[] = ['title' => '新增模型字段', 'url' => ''];
74
        return view('admin.entityField.add', ['breadcrumb' => $this->breadcrumb, 'entity' => $entity]);
75
    }
76
77
    /**
78
     * 模型字段管理-保存模型字段
79
     *
80
     * @param EntityFieldRequest $request
81
     * @return array
82
     */
83
    public function save(EntityFieldRequest $request)
84
    {
85
        try {
86
            $data = $request->only($this->formNames);
87
            $data['is_show'] = $data['is_show'] ?? EntityField::SHOW_DISABLE;
88
            $data['is_edit'] = $data['is_edit'] ?? EntityField::EDIT_DISABLE;
89
            $data['is_required'] = $data['is_required'] ?? EntityField::REQUIRED_DISABLE;
90
            $data['is_show_inline'] = $data['is_show_inline'] ?? EntityField::SHOW_NOT_INLINE;
91
            $modifyDB = $request->post('is_modify_db');
92
93
            $table = EntityRepository::find($data['entity_id']);
94
            if (!$table) {
95
                return [
96
                    'code' => 1,
97
                    'msg' => '新增失败:模型不存在',
98
                ];
99
            }
100
            if ($modifyDB && Schema::hasColumn($table->table_name, $data['name'])) {
101
                return [
102
                    'code' => 2,
103
                    'msg' => '新增失败:字段已存在',
104
                ];
105
            }
106
            if (!in_array($data['type'], config('light.db_table_field_type'))) {
107
                return [
108
                    'code' => 3,
109
                    'msg' => '新增失败:无效字段类型',
110
                ];
111
            }
112
            // 一个模型只能有一个 inputTags 表单类型
113
            if (EntityFieldRepository::formTypeBeUnique($data['form_type'])
114
                && EntityFieldRepository::getInputTagsField($data['entity_id'])) {
115
                return [
116
                    'code' => 4,
117
                    'msg' => '新增失败:一个模型只能有一个标签输入框表单类型',
118
                ];
119
            }
120
121
            // inputTags类型表单不需要添加数据库字段
122
            if (in_array($data['form_type'], ['inputTags'], true)) {
123
                $modifyDB = false;
124
            }
125
            if ($modifyDB) {
126
                Schema::table($table->table_name, function (Blueprint $table) use ($data) {
127
                    $m = $data['type'];
128
                    $length = intval($data['field_length']);
129
                    $total = intval($data['field_total']);
130
                    $scale = intval($data['field_scale']);
131
                    if (in_array($m, ['char', 'string'])) {
132
                        $table->$m($data['name'], $length > 0 ? $length : 255)
133
                            ->comment($data['comment'])
134
                            ->default(strval($data['default_value']));
135
                    } elseif (Str::contains(Str::lower($m), 'integer')) {
136
                        $table->$m($data['name'])
137
                            ->comment($data['comment'])
138
                            ->default(intval($data['default_value']));
139
                    } elseif (in_array($m, ['float', 'double', 'decimal', 'unsignedDecimal'])) {
140
                        if ($total > 0 && $scale > 0 && $total > $scale) {
141
                            $table->$m($data['name'], $total, $scale)
142
                                ->comment($data['comment'])
143
                                ->default(doubleval($data['default_value']));
144
                        } else {
145
                            $table->$m($data['name'])
146
                                ->comment($data['comment'])
147
                                ->default(doubleval($data['default_value']));
148
                        }
149
                    } else {
150
                        $table->$m($data['name'])->comment($data['comment'])->nullable();
151
                    }
152
                });
153
            }
154
155
            unset($data['field_length'], $data['field_total'], $data['field_scale']);
156
            EntityFieldRepository::add($data);
157
158
            return [
159
                'code' => 0,
160
                'msg' => '新增成功',
161
                'redirect' => true
162
            ];
163
        } catch (\Exception $e) {
164
            Log::error($e);
165
            return [
166
                'code' => 1,
167
                'msg' => '新增失败:' . $e->getMessage(),
168
            ];
169
        }
170
    }
171
172
    /**
173
     * 模型字段管理-编辑模型字段
174
     *
175
     * @param int $id
176
     * @return View
177
     */
178
    public function edit($id)
179
    {
180
        $this->breadcrumb[] = ['title' => '编辑模型字段', 'url' => ''];
181
182
        $model = EntityFieldRepository::find($id);
183
        $entity = Entity::query()->pluck('name', 'id')->all();
184
        return view('admin.entityField.add', [
185
            'id' => $id,
186
            'model' => $model,
187
            'breadcrumb' => $this->breadcrumb,
188
            'entity' => $entity
189
        ]);
190
    }
191
192
    /**
193
     * 模型字段管理-更新模型字段
194
     *
195
     * @param EntityFieldRequest $request
196
     * @param int $id
197
     * @return array
198
     */
199
    public function update(EntityFieldRequest $request, $id)
200
    {
201
        $data = $request->only($this->formNames);
202
        $data['is_show'] = $data['is_show'] ?? EntityField::SHOW_DISABLE;
203
        $data['is_edit'] = $data['is_edit'] ?? EntityField::EDIT_DISABLE;
204
        $data['is_required'] = $data['is_required'] ?? EntityField::REQUIRED_DISABLE;
205
        $data['is_show_inline'] = $data['is_show_inline'] ?? EntityField::SHOW_NOT_INLINE;
206
        // 一个模型只能有一个 inputTags 表单类型
207
        if (EntityFieldRepository::formTypeBeUnique($data['form_type']) && EntityFieldRepository::getInputTagsField($data['entity_id'])) {
208
            return [
209
                'code' => 4,
210
                'msg' => '编辑失败:一个模型只能有一个标签输入框表单类型',
211
            ];
212
        }
213
        try {
214
            unset($data['field_length'], $data['field_total'], $data['field_scale'], $data['entity_id']);
215
            EntityFieldRepository::update($id, $data);
216
            return [
217
                'code' => 0,
218
                'msg' => '编辑成功',
219
                'redirect' => true
220
            ];
221
        } catch (QueryException $e) {
222
            Log::error($e);
223
            return [
224
                'code' => 1,
225
                'msg' => '编辑失败:' . (Str::contains($e->getMessage(), 'Duplicate entry') ? '当前模型字段已存在' : '其它错误'),
226
                'redirect' => false
227
            ];
228
        }
229
    }
230
231
    /**
232
     * 模型字段管理-删除模型字段
233
     *
234
     * @param int $id
235
     * @return array
236
     */
237
    public function delete($id)
238
    {
239
        try {
240
            $entityField = EntityField::query()->findOrFail($id);
241
            $entity = $entityField->entity;
242
            Schema::table($entity->table_name, function (Blueprint $table) use ($entityField) {
243
                $table->dropColumn($entityField->name);
244
            });
245
            EntityFieldRepository::delete($id);
246
            return [
247
                'code' => 0,
248
                'msg' => '删除成功',
249
                'redirect' => true
250
            ];
251
        } catch (ModelNotFoundException $e) {
252
            return [
253
                'code' => 2,
254
                'msg' => '删除失败:字段不存在',
255
                'redirect' => false
256
            ];
257
        } catch (\RuntimeException $e) {
258
            return [
259
                'code' => 1,
260
                'msg' => '删除失败:' . $e->getMessage(),
261
                'redirect' => false
262
            ];
263
        }
264
    }
265
266
    /**
267
     * 模型字段管理-字段快捷更新接口
268
     *
269
     * @param Request $request
270
     * @param int $id
271
     * @return array
272
     */
273
    public function listUpdate(Request $request, $id)
274
    {
275
        try {
276
            $entityField = EntityField::query()->findOrFail($id);
277
278
            $data = $request->only(['is_show', 'is_edit', 'is_required', 'order', 'is_show_inline']);
279
            foreach ($data as $key => $value) {
280
                $entityField->$key = $value;
281
            }
282
            $entityField->save();
283
            return [
284
                'code' => 0,
285
                'msg' => '保存成功',
286
                'redirect' => true
287
            ];
288
        } catch (ModelNotFoundException $e) {
289
            return [
290
                'code' => 2,
291
                'msg' => '保存失败:记录不存在',
292
                'redirect' => false
293
            ];
294
        }
295
    }
296
}
297