leftJoin('city as c', 'p.city_id', '=', 'c.city_id') ->select([ 'p.*', 'c.city_name', ]); if ($request->filled('park_name')) { $query->where('p.park_name', 'like', '%' . $request->input('park_name') . '%'); } if ($request->filled('city_id')) { $query->where('p.city_id', $request->input('city_id')); } if ($request->filled('sort')) { $query->orderBy($request->input('sort'), $request->input('sort_type', 'asc')); } else { $query->orderBy('p.park_id', 'asc'); } $parks = $query->paginate(20); $cities = \DB::table('city')->orderBy('city_id')->get(); $sort = $request->input('sort', 'p.park_id'); $sort_type = $request->input('sort_type', 'asc'); return view('admin.parks.list', compact('parks', 'cities', 'sort', 'sort_type')); } public function add(Request $request) { $cities = \DB::table('city')->orderBy('city_id')->get(); if ($request->isMethod('post')) { // バリデーション(必要な項目だけ例示) $validated = $request->validate([ 'city_id' => 'required|integer', 'park_name' => 'required|string|max:255', // 他の項目も必要に応じて追加 ]); // 保存処理 $park = new \App\Models\Park(); $park->fill($validated); $park->operator_id = auth()->user()->ope_id ?? 1; $park->save(); return redirect()->route('parks')->with('success', '新規登録に完了しました。'); } return view('admin.parks.add', [ 'cities' => $cities, ]); } public function edit(Request $request, $pk, $view = '') { $park = Park::find($pk); if (empty($pk) || empty($park)) { abort('404'); } $data = $park->getAttributes(); $dataList = $this->getDataDropList(); $data = array_merge($data, $dataList); if ($request->isMethod('POST') || $request->isMethod('PUT')) { // ここをaddと同じバリデーションに変更 $validated = $request->validate([ 'city_id' => 'required|integer', 'park_name' => 'required|string|max:255', // 他の項目も必要に応じて追加 ]); \DB::transaction(function () use ($validated, &$type, $park) { $park->fill($validated); $park->save(); $type = true; }); $request->session()->flash('success', __('更新に成功しました')); return redirect()->route('parks'); } if ($view != '') { return view($view, $data); } return view('admin.parks.edit', [ 'park' => $park, 'cities' => $dataList['cities'] ?? [], // 必要な他の変数もここで渡す ]); } public function delete(Request $request) { $arr_pk = $request->get('pk'); if ($arr_pk) { if (Park::destroy($arr_pk)) { return redirect()->route('parks')->with('success', __("削除が完了しました。")); } else { return redirect()->route('parks')->with('error', __('削除に失敗しました。')); } } return redirect()->route('parks')->with('error', __('削除するユーザーを選択してください。')); } public function info(Request $request, $id) { return $this->edit($request, $id, 'admin.parks.info'); } public function getDataDropList() { $data['cities'] = City::orderBy('city_id')->get(); return $data; } public function export(Request $request) { $columns = [ '駐輪場ID', '市区', '駐輪場名', '駐輪場ふりがな', '駐輪場五十音', '住所', '閉設フラグ', '閉設日', '残警告チェックフラグ', '印字数', '最新キープアライブ', '更新オペレータID', '更新期間開始日', '更新期間開始時', '更新期間終了日', '更新期間終了時', '駐輪開始期間', 'リマインダー種別', 'リマインダー時間', '契約後即利用許可', '項目表示設定:性別', '項目表示設定:生年月日', '項目表示設定:防犯登録番号', '二点間距離', '駐車場座標(緯度)', '駐車場座標(経度)', '電話番号', '駐輪場契約形態(定期)', '駐輪場契約形態(一時利用)', '車種制限', '手続方法', '支払方法', '利用可能時間制限フラグ', '利用可能時間(開始)', '利用可能時間(終了)', '常駐管理人フラグ', '常駐時間(開始)', '常駐時間(終了)', '屋根フラグ', 'シール発行機フラグ', '駐輪場利用方法', '定期更新期間', '空き待ち予約', '特記事項', '学生証確認種別', '減免案内表示フラグ', '減免対象年齢', '減免案内表示開始月数', '年跨ぎ' ]; $dataExport = DB::table('park as p') ->select([ 'p.park_id', 'p.city_id', 'p.park_name', 'p.park_ruby', 'p.park_syllabary', 'p.park_adrs', 'p.park_close_flag', 'p.park_day', 'p.alert_flag', 'p.print_number', 'p.keep_alive', 'p.operator_id', 'p.update_grace_period_start_date', 'p.update_grace_period_start_time', 'p.update_grace_period_end_date', 'p.update_grace_period_end_time', 'p.parking_start_grace_period', 'p.reminder_type', 'p.reminder_time', 'p.immediate_use_permit', 'p.gender_display_flag', 'p.bd_display_flag', 'p.securityreg_display_flag', 'p.distance_twopoints', 'p.park_latitude', 'p.park_longitude', 'p.park_tel', 'p.park_fixed_contract', 'p.park_temporary_contract', 'p.park_restriction', 'p.park_procedure', 'p.park_payment', 'p.park_available_time_flag', 'p.park_available_time_from', 'p.park_available_time_to', 'p.park_manager_flag', 'p.park_manager_resident_from', 'p.park_manager_resident_to', 'p.park_roof_flag', 'p.park_issuing_machine_flag', 'p.park_using_method', 'p.park_contract_renewal_term', 'p.park_reservation', 'p.park_reference', 'p.student_id_confirm_type', 'p.reduction_guide_display_flag', 'p.reduction_age', 'p.reduction_guide_display_start_month', 'p.overyear_flag' ]) ->orderBy('p.park_id', 'asc') ->get(); $response = new StreamedResponse(function () use ($dataExport, $columns) { $stream = fopen('php://output', 'w'); // Excel兼容 BOM fwrite($stream, chr(0xEF) . chr(0xBB) . chr(0xBF)); fputcsv($stream, $columns); foreach ($dataExport as $item) { fputcsv($stream, [ $item->park_id, $item->city_id, $item->park_name, $item->park_ruby, $item->park_syllabary, $item->park_adrs, $item->park_close_flag, $item->park_day, $item->alert_flag, $item->print_number, $item->keep_alive, $item->operator_id, $item->update_grace_period_start_date, $item->update_grace_period_start_time, $item->update_grace_period_end_date, $item->update_grace_period_end_time, $item->parking_start_grace_period, $item->reminder_type, $item->reminder_time, $item->immediate_use_permit, $item->gender_display_flag, $item->bd_display_flag, $item->securityreg_display_flag, $item->distance_twopoints, $item->park_latitude, $item->park_longitude, $item->park_tel, $item->park_fixed_contract, $item->park_temporary_contract, $item->park_restriction, $item->park_procedure, $item->park_payment, $item->park_available_time_flag, $item->park_available_time_from, $item->park_available_time_to, $item->park_manager_flag, $item->park_manager_resident_from, $item->park_manager_resident_to, $item->park_roof_flag, $item->park_issuing_machine_flag, $item->park_using_method, $item->park_contract_renewal_term, $item->park_reservation, $item->park_reference, $item->student_id_confirm_type, $item->reduction_guide_display_flag, $item->reduction_age, $item->reduction_guide_display_start_month, $item->overyear_flag ]); } fclose($stream); }); $response->headers->set('Content-Type', 'text/csv; charset=UTF-8'); $response->headers->set('Content-Disposition', 'attachment; filename="駐輪場マスタ.csv"'); $response->headers->set('Cache-Control', 'no-store, no-cache'); return $response; } public function import(Request $request) { $file = $request->file('file'); if (!empty($file)) { $data = Utils::csvToArray($file); $type = 1; $msg = ''; $record = 0; DB::beginTransaction(); try { Park::query()->delete(); $col = 13; foreach ($data as $key => $items) { $record = $key + 2; if (count($items) == $col) { $row = new Park(); $row->park_id = $items[0]; $row->city_id = $items[1]; $row->park_name = $items[3]; $row->park_ruby = $items[4]; $row->park_syllabary = $items[5]; $row->park_adrs = $items[6]; $row->park_close_flag = $items[7]; $row->park_day = $items[9]; $row->alert_flag = $items[10]; $row->print_number = $items[11]; $row->keep_alive = $items[12]; if (!$row->save()) { $type = 0; $msg = '行:record型が一致しません。'; break; } } else { $type = 0; $msg = '行:record列数が一致しません。'; break; } } } catch (\Exception $e) { $msg = '行:record型が一致しません。'; $type = 0; } if ($type) { DB::commit(); return redirect()->route('parks')->with('success', __('輸入成功')); } else { DB::rollBack(); return redirect()->route('parks')->with('error', __($msg, ['record' => $record])); } } else { return redirect()->route('parks')->with('error', __('あなたはcsvファイルを選択していません。')); } } public function checkDuplicate(\Illuminate\Http\Request $request) { $parkName = $request->input('park_name'); $duplicate = Park::where('park_name', $parkName)->first(); if ($duplicate) { return response()->json([ 'duplicate' => true, 'park_id' => $duplicate->park_id, 'park_name' => $duplicate->park_name, ]); } return response()->json(['duplicate' => false]); } }