251 lines
8.1 KiB
PHP
251 lines
8.1 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Controllers\Admin;
|
||
|
||
use App\Http\Controllers\Controller;
|
||
use Illuminate\Http\Request;
|
||
use App\Models\Zone;
|
||
use Illuminate\Support\Facades\DB;
|
||
use Illuminate\Support\Facades\Validator;
|
||
use App\Models\Park;
|
||
use App\Models\Ptype;
|
||
use App\Models\Psection;
|
||
|
||
|
||
class ZoneController extends Controller
|
||
{
|
||
/**
|
||
* 一覧表示(絞り込み対応)
|
||
*/
|
||
public function list(Request $request)
|
||
{
|
||
if ($request->input('action') === 'reset') {
|
||
return redirect()->route('zones');
|
||
}
|
||
|
||
// ソート設定
|
||
$sort = $request->input('sort', 'zone_id');
|
||
$sort_type = $request->input('sort_type', 'asc');
|
||
|
||
// ベースクエリ
|
||
$query = Zone::query();
|
||
|
||
// === 絞り込み条件 ===
|
||
if ($request->filled('zone_id')) {
|
||
$query->where('zone_id', $request->zone_id);
|
||
}
|
||
if ($request->filled('zone_name')) {
|
||
$query->where('zone_name', 'LIKE', "%{$request->zone_name}%");
|
||
}
|
||
if ($request->filled('park_id')) {
|
||
$query->where('park_id', $request->park_id);
|
||
}
|
||
if ($request->filled('ptype_id')) {
|
||
$query->where('ptype_id', $request->ptype_id);
|
||
}
|
||
if ($request->filled('psection_id')) {
|
||
$query->where('psection_id', $request->psection_id);
|
||
}
|
||
if ($request->has('use_flag') && $request->use_flag !== '') {
|
||
$query->where('use_flag', $request->use_flag);
|
||
}
|
||
|
||
// ページネーション
|
||
$zones = $query->orderBy($sort, $sort_type)->paginate(20);
|
||
|
||
// === 下拉选单用の一覧データ ===
|
||
$parkList = DB::table('park')->pluck('park_name', 'park_id');
|
||
$ptypeList = DB::table('ptype')->pluck('ptype_subject', 'ptype_id');
|
||
$psectionList = DB::table('psection')->pluck('psection_subject', 'psection_id');
|
||
|
||
return view('admin.zones.list', compact(
|
||
'zones', 'sort', 'sort_type',
|
||
'parkList', 'ptypeList', 'psectionList'
|
||
));
|
||
}
|
||
|
||
/**
|
||
* 新規登録(画面/処理)
|
||
*/
|
||
public function add(Request $request)
|
||
{
|
||
if ($request->isMethod('get')) {
|
||
$parkList = DB::table('park')->pluck('park_name', 'park_id');
|
||
$ptypeList = DB::table('ptype')->pluck('ptype_subject', 'ptype_id');
|
||
$psectionList = DB::table('psection')->pluck('psection_subject', 'psection_id');
|
||
|
||
|
||
return view('admin.zones.add', [
|
||
'isEdit' => false,
|
||
'record' => new Zone(),
|
||
'parkList' => $parkList,
|
||
'ptypeList' => $ptypeList,
|
||
'psectionList' => $psectionList,
|
||
]);
|
||
}
|
||
|
||
// ▼ POST時:バリデーション
|
||
$rules = [
|
||
'park_id' => 'required|integer',
|
||
'ptype_id' => 'required|integer',
|
||
'psection_id' => 'required|integer',
|
||
'zone_name' => 'required|string|max:255',
|
||
'zone_number' => 'nullable|integer|min:0',
|
||
'zone_standard' => 'nullable|integer|min:0',
|
||
'zone_tolerance' => 'nullable|integer|min:0',
|
||
'zone_sort' => 'nullable|integer|min:0',
|
||
];
|
||
|
||
$messages = [
|
||
'park_id.required' => '駐輪場は必須です。',
|
||
'ptype_id.required' => '駐輪分類は必須です。',
|
||
'psection_id.required' => '車種区分は必須です。',
|
||
'zone_name.required' => 'ゾーン名は必須です。',
|
||
];
|
||
|
||
$validator = Validator::make($request->all(), $rules, $messages);
|
||
|
||
if ($validator->fails()) {
|
||
return redirect()->back()->withErrors($validator)->withInput();
|
||
}
|
||
|
||
// ▼ 登録処理
|
||
DB::transaction(function () use ($request) {
|
||
$new = new Zone();
|
||
$new->fill($request->only([
|
||
'park_id',
|
||
'ptype_id',
|
||
'psection_id',
|
||
'zone_name',
|
||
'zone_number',
|
||
'zone_standard',
|
||
'zone_tolerance',
|
||
'zone_sort',
|
||
]));
|
||
$new->save();
|
||
});
|
||
|
||
return redirect()->route('zones')->with('success', '登録しました。');
|
||
}
|
||
|
||
/**
|
||
* 編集(画面/処理)
|
||
*/
|
||
public function edit(Request $request, $id)
|
||
{
|
||
// 該当データ取得
|
||
$record = Zone::find($id);
|
||
if (!$record) {
|
||
abort(404);
|
||
}
|
||
|
||
$parkList = DB::table('park')->pluck('park_name', 'park_id');
|
||
$ptypeList = DB::table('ptype')->pluck('ptype_subject', 'ptype_id');
|
||
$psectionList = DB::table('psection')->pluck('psection_subject', 'psection_id');
|
||
|
||
|
||
if ($request->isMethod('get')) {
|
||
// 編集画面表示
|
||
return view('admin.zones.edit', [
|
||
'isEdit' => true,
|
||
'record' => $record,
|
||
'parkList' => $parkList,
|
||
'ptypeList' => $ptypeList,
|
||
'psectionList' => $psectionList,
|
||
]);
|
||
}
|
||
|
||
// ▼ POST時:バリデーション
|
||
$rules = [
|
||
'park_id' => 'required|integer',
|
||
'ptype_id' => 'required|integer',
|
||
'psection_id' => 'required|integer',
|
||
'zone_name' => 'required|string|max:255',
|
||
'zone_number' => 'nullable|integer|min:0',
|
||
'zone_standard' => 'nullable|integer|min:0',
|
||
'zone_tolerance' => 'nullable|integer|min:0',
|
||
'zone_sort' => 'nullable|integer|min:0',
|
||
];
|
||
|
||
$messages = [
|
||
'park_id.required' => '駐輪場は必須です。',
|
||
'ptype_id.required' => '駐輪分類は必須です。',
|
||
'psection_id.required' => '車種区分は必須です。',
|
||
'zone_name.required' => 'ゾーン名は必須です。',
|
||
];
|
||
|
||
$validator = Validator::make($request->all(), $rules, $messages);
|
||
|
||
if ($validator->fails()) {
|
||
return redirect()->back()->withErrors($validator)->withInput();
|
||
}
|
||
|
||
// ▼ 更新処理
|
||
DB::transaction(function () use ($request, $record) {
|
||
$record->fill($request->only([
|
||
'park_id',
|
||
'ptype_id',
|
||
'psection_id',
|
||
'zone_name',
|
||
'zone_number',
|
||
'zone_standard',
|
||
'zone_tolerance',
|
||
'zone_sort',
|
||
]));
|
||
$record->save();
|
||
});
|
||
|
||
return redirect()->route('zones')->with('success', '更新しました。');
|
||
}
|
||
|
||
/**
|
||
* 削除(単一/複数対応)
|
||
*/
|
||
public function delete(Request $request)
|
||
{
|
||
$ids = [];
|
||
|
||
// 単一削除(id 指定)
|
||
if ($request->filled('id')) {
|
||
$ids[] = (int) $request->input('id');
|
||
}
|
||
|
||
// 複数削除(チェックボックス pk[])
|
||
if (is_array($request->input('pk'))) {
|
||
$ids = array_merge($ids, $request->input('pk'));
|
||
}
|
||
|
||
// 重複除去 & 数値変換
|
||
$ids = array_values(array_unique(array_map('intval', $ids)));
|
||
|
||
// 削除対象がない場合
|
||
if (empty($ids)) {
|
||
return back()->with('error', '削除対象が選択されていません。');
|
||
}
|
||
|
||
// 削除実行
|
||
Zone::whereIn('zone_id', $ids)->delete();
|
||
|
||
return redirect()->route('zones')->with('success', '削除しました。');
|
||
}
|
||
|
||
|
||
/**
|
||
* バリデーション共通化
|
||
*/
|
||
private function validateZone(Request $request)
|
||
{
|
||
return $request->validate([
|
||
'zone_name' => 'required|string|max:50',
|
||
'park_id' => 'required|integer',
|
||
'ptype_id' => 'nullable|integer',
|
||
'psection_id' => 'nullable|integer',
|
||
'zone_number' => 'nullable|integer|min:0',
|
||
'zone_standard' => 'nullable|integer|min:0',
|
||
'zone_tolerance' => 'nullable|integer|min:0',
|
||
'use_flag' => 'nullable|boolean',
|
||
'memo' => 'nullable|string|max:255',
|
||
]);
|
||
}
|
||
}
|