Passed
Push — master ( 9e08a8...d1db17 )
by Jianhua
03:26
created

EntityFieldController::update()   A

Complexity

Conditions 3
Paths 5

Size

Total Lines 21
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 18
c 1
b 0
f 0
nc 5
nop 2
dl 0
loc 21
rs 9.6666
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 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'
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
        $condition = $request->only($this->formNames);
59
60
        $data = EntityFieldRepository::list($perPage, $condition);
61
62
        return $data;
63
    }
64
65
    /**
66
     * 模型字段管理-新增模型字段
67
     *
68
     */
69
    public function create()
70
    {
71
        $entity = Entity::query()->pluck('name', 'id')->all();
72
        $this->breadcrumb[] = ['title' => '新增模型字段', 'url' => ''];
73
        return view('admin.entityField.add', ['breadcrumb' => $this->breadcrumb, 'entity' => $entity]);
74
    }
75
76
    /**
77
     * 模型字段管理-保存模型字段
78
     *
79
     * @param EntityFieldRequest $request
80
     * @return array
81
     */
82
    public function save(EntityFieldRequest $request)
83
    {
84
        try {
85
            $data = $request->only($this->formNames);
86
            $data['is_show'] = $data['is_show'] ?? EntityField::SHOW_DISABLE;
87
            $data['is_edit'] = $data['is_edit'] ?? EntityField::EDIT_DISABLE;
88
            $data['is_required'] = $data['is_required'] ?? EntityField::REQUIRED_DISABLE;
89
            $data['is_show_inline'] = $data['is_show_inline'] ?? EntityField::SHOW_NOT_INLINE;
90
91
            $table = EntityRepository::find($data['entity_id']);
92
            if (!$table) {
93
                return [
94
                    'code' => 1,
95
                    'msg' => '新增失败:模型不存在',
96
                ];
97
            }
98
            if (Schema::hasColumn($table->table_name, $data['name'])) {
99
                return [
100
                    'code' => 2,
101
                    'msg' => '新增失败:字段已存在',
102
                ];
103
            }
104
            if (!in_array($data['type'], config('light.db_table_field_type'))) {
105
                return [
106
                    'code' => 3,
107
                    'msg' => '新增失败:无效字段类型',
108
                ];
109
            }
110
111
            Schema::table($table->table_name, function (Blueprint $table) use ($data) {
112
                $m = $data['type'];
113
                $length = intval($data['field_length']);
114
                $total = intval($data['field_total']);
115
                $scale = intval($data['field_scale']);
116
                if (in_array($m, ['char', 'string'])) {
117
                    $table->$m($data['name'], $length > 0 ? $length : 255)
118
                        ->comment($data['comment'])
119
                        ->default(strval($data['default_value']));
120
                } elseif (Str::contains(Str::lower($m), 'integer')) {
121
                    $table->$m($data['name'])
122
                        ->comment($data['comment'])
123
                        ->default(intval($data['default_value']));
124
                } elseif (in_array($m, ['float', 'double', 'decimal', 'unsignedDecimal'])) {
125
                    if ($total > 0 && $scale > 0 && $total > $scale) {
126
                        $table->$m($data['name'], $total, $scale)
127
                            ->comment($data['comment'])
128
                            ->default(doubleval($data['default_value']));
129
                    } else {
130
                        $table->$m($data['name'])
131
                            ->comment($data['comment'])
132
                            ->default(doubleval($data['default_value']));
133
                    }
134
                } else {
135
                    $table->$m($data['name'])->comment($data['comment'])->nullable();
136
                }
137
            });
138
139
            unset($data['field_length'], $data['field_total'], $data['field_scale']);
140
            EntityFieldRepository::add($data);
141
142
            return [
143
                'code' => 0,
144
                'msg' => '新增成功',
145
                'redirect' => true
146
            ];
147
        } catch (\Exception $e) {
148
            \Log::error($e);
149
            return [
150
                'code' => 1,
151
                'msg' => '新增失败:' . $e->getMessage(),
152
            ];
153
        }
154
    }
155
156
    /**
157
     * 模型字段管理-编辑模型字段
158
     *
159
     * @param int $id
160
     * @return View
161
     */
162
    public function edit($id)
163
    {
164
        $this->breadcrumb[] = ['title' => '编辑模型字段', 'url' => ''];
165
166
        $model = EntityFieldRepository::find($id);
167
        $entity = Entity::query()->pluck('name', 'id')->all();
168
        return view('admin.entityField.add', [
169
            'id' => $id,
170
            'model' => $model,
171
            'breadcrumb' => $this->breadcrumb,
172
            'entity' => $entity
173
        ]);
174
    }
175
176
    /**
177
     * 模型字段管理-更新模型字段
178
     *
179
     * @param EntityFieldRequest $request
180
     * @param int $id
181
     * @return array
182
     */
183
    public function update(EntityFieldRequest $request, $id)
184
    {
185
        $data = $request->only($this->formNames);
186
        $data['is_show'] = $data['is_show'] ?? EntityField::SHOW_DISABLE;
187
        $data['is_edit'] = $data['is_edit'] ?? EntityField::EDIT_DISABLE;
188
        $data['is_required'] = $data['is_required'] ?? EntityField::REQUIRED_DISABLE;
189
        $data['is_show_inline'] = $data['is_show_inline'] ?? EntityField::SHOW_NOT_INLINE;
190
        try {
191
            unset($data['field_length'], $data['field_total'], $data['field_scale'], $data['entity_id']);
192
            EntityFieldRepository::update($id, $data);
193
            return [
194
                'code' => 0,
195
                'msg' => '编辑成功',
196
                'redirect' => true
197
            ];
198
        } catch (QueryException $e) {
199
            \Log::error($e);
200
            return [
201
                'code' => 1,
202
                'msg' => '编辑失败:' . (Str::contains($e->getMessage(), 'Duplicate entry') ? '当前模型字段已存在' : '其它错误'),
203
                'redirect' => false
204
            ];
205
        }
206
    }
207
208
    /**
209
     * 模型字段管理-删除模型字段
210
     *
211
     * @param int $id
212
     */
213
    public function delete($id)
214
    {
215
        try {
216
            $entityField = EntityField::query()->findOrFail($id);
217
            $entity = $entityField->entity;
218
            Schema::table($entity->table_name, function (Blueprint $table) use ($entityField) {
219
                $table->dropColumn($entityField->name);
220
            });
221
            EntityFieldRepository::delete($id);
222
            return [
223
                'code' => 0,
224
                'msg' => '删除成功',
225
                'redirect' => true
226
            ];
227
        } catch (ModelNotFoundException $e) {
228
            return [
229
                'code' => 2,
230
                'msg' => '删除失败:字段不存在',
231
                'redirect' => false
232
            ];
233
        } catch (\RuntimeException $e) {
234
            return [
235
                'code' => 1,
236
                'msg' => '删除失败:' . $e->getMessage(),
237
                'redirect' => false
238
            ];
239
        }
240
    }
241
242
    public function listUpdate(Request $request, $id)
243
    {
244
        try {
245
            $entityField = EntityField::query()->findOrFail($id);
246
247
            $order = $request->post('order', 77);
248
            $entityField->order = $order;
249
            $entityField->save();
250
            return [
251
                'code' => 0,
252
                'msg' => '保存成功',
253
                'redirect' => true
254
            ];
255
        } catch (ModelNotFoundException $e) {
256
            return [
257
                'code' => 2,
258
                'msg' => '保存失败:记录不存在',
259
                'redirect' => false
260
            ];
261
        }
262
    }
263
}
264