Completed
Push — master ( b619ea...0d36d8 )
by Jianhua
03:31
created

EntityFieldController::update()   B

Complexity

Conditions 7
Paths 140

Size

Total Lines 30
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

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