Laravel Crud 操作和 Json 处理

问题描述 投票:0回答:1

好吧,所以我所做的是一个应用程序,它消耗存储中的 json 文件并将它们作为项目放入洗碗机的数据库中。 json 处理和使用都很顺利,除了编辑数据库中的当前项目之外,所有路由都很好: DeviceController 的代码在这里:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Device;
use App\Models\DetergentPump;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage;


class DeviceController extends Controller
{
    
    public function processJsonFile(Request $request)
    {


$jsonFiles = Storage::files('json');

    foreach ($jsonFiles as $jsonFile) {
        if(Storage::exists($jsonFile)){
        $jsonContent = json_decode(Storage::get($jsonFile), true); 
           
            // Process and store the data
            $device = Device::create([
                'device_id' => $jsonContent['device_id'],
                'location_name' => $jsonContent['location_name'],
            ]);

            foreach ($jsonContent['detergent_pumps'] as $pumpData) {
                DetergentPump::create([
                    'device_id' => $device->device_id,
                    'name' => $pumpData['name'],
                    'active' => $pumpData['active'],
                    'trigger' => $pumpData['trigger'],
                    'dosage' => $pumpData['dosage'],
                    'xp' => $pumpData['xp'],
                    'xt' => $pumpData['xt'],
                    'total' => $pumpData['total'],
                    'remaining' => $pumpData['remaining'],
                ]);
            }
            dd("1");
            return redirect('/devices')->with('success', 'Data processed and stored successfully.');
        } else {
            dd("2");
            return redirect('/devices')->with('error', 'JSON file not found.');
        }



    }

    return redirect('/devices')->with('success', 'All JSON files processed and stored successfully.');






}


public function index()
{   
    
    $devices = Device::all();

    return view('devices.index', compact('devices'));
}

public function show($id)
{
    $device = Device::findOrFail($id);

    return view('devices.show', compact('device'));
}


public function create()
{
    
    return view('devices.create');
}

public function store(Request $request)
{
    $request->validate([
        'device_id' => 'required|unique:devices',
        'location_name' => 'required',
    ]);

    Device::create($request->all());

    return redirect('/devices')->with('success', 'Device created successfully.');
}

public function edit($id)
{
    $device = Device::findOrFail($id);

    return view('devices.edit', compact('device'));
}




public function update(Request $request, Device $device)
{
    // dd('Before validation', $request->all());
    $request->validate([
        'location_name' => 'required',
        'detergent_pumps' => 'required|array',
        'detergent_pumps.*.name' => 'required|string',
        'detergent_pumps.*.dosage' => 'required|numeric',
        'detergent_pumps.*.active' => 'boolean',
        'detergent_pumps.*.trigger' => 'required|string',
        'detergent_pumps.*.xp' => 'required|numeric',
        'detergent_pumps.*.xt' => 'required|numeric',
        'detergent_pumps.*.total' => 'required|numeric',
        'detergent_pumps.*.remaining' => 'required|numeric',
    ]);

    dd('After validation, before update', $request->all());

    // Update the device
    $device->update([
        'location_name' => $request->input('location_name'),
    ]);

    dd('After update, before detergent pumps loop', $request->all());

    // Update or create detergent pumps
    foreach ($request->input('detergent_pumps') as $pumpData) {
        if (isset($pumpData['id'])) {
            // Update existing detergent pump
            $detergentPump = DetergentPump::findOrFail($pumpData['id']);
            $detergentPump->update($pumpData);
        } else {
            // Create new detergent pump
            $device->detergentPumps()->create([
                'name' => $pumpData['name'],
                'dosage' => $pumpData['dosage'],
                'active' => $pumpData['active'],
                'trigger' => $pumpData['trigger'],
                'xp' => $pumpData['xp'],
                'xt' => $pumpData['xt'],
                'total' => $pumpData['total'],
                'remaining' => $pumpData['remaining'],
            ]);
        }
    }

    dd('After detergent pumps loop', $request->all());

    return redirect('/devices')->with('success', 'Device and detergent pumps updated successfully.');
}




public function destroy($id)
{
    $device = Device::findOrFail($id);
    $device->delete();

    return redirect('/devices')->with('success', 'Device deleted successfully.');
}


}

edit.blade.php 文件是这个:

<!-- resources/views/devices/edit.blade.php -->

<form method="post" action="{{ route('devices.update', ['device' => $device->id]) }}">
    @csrf
    @method('PATCH')

    <div class="container mt-4">
        <h3>Edit Device</h3>

        <!-- Device fields -->
        <div class="form-group">
            <label for="location_name">Location Name:</label>
            <input type="text" class="form-control" name="location_name" value="{{ old('location_name', $device->location_name) }}">
        </div>

        <!-- Detergent pumps fields -->
        <table class="table table-bordered mt-3">
            <thead>
                <tr>
                    <th>Name</th>
                    <th>Dosage</th>
                    <th>Active</th>
                    <th>Trigger</th>
                    <th>XP</th>
                    <th>XT</th>
                    <th>Total</th>
                    <th>Remaining</th>
                </tr>
            </thead>
            <tbody>
                @foreach ($device->detergentPumps as $index => $pump)
                    <tr>
                        <td>
                            <input type="text" class="form-control" name="detergent_pumps[{{ $index }}][name]" value="{{ old('detergent_pumps.'.$index.'.name', $pump->name) }}">
                        </td>
                        <td>
                            <input type="text" class="form-control" name="detergent_pumps[{{ $index }}][dosage]" value="{{ old('detergent_pumps.'.$index.'.dosage', $pump->dosage) }}">
                        </td>
                        <td>
                            <input type="checkbox" class="form-check-input" name="detergent_pumps[{{ $index }}][active]" {{ old('detergent_pumps.'.$index.'.active', $pump->active) ? 'checked' : '' }}>
                        </td>
                        <td>
                            <input type="text" class="form-control" name="detergent_pumps[{{ $index }}][trigger]" value="{{ old('detergent_pumps.'.$index.'.trigger', $pump->trigger) }}">
                        </td>
                        <td>
                            <input type="text" class="form-control" name="detergent_pumps[{{ $index }}][xp]" value="{{ old('detergent_pumps.'.$index.'.xp', $pump->xp) }}">
                        </td>
                        <td>
                            <input type="text" class="form-control" name="detergent_pumps[{{ $index }}][xt]" value="{{ old('detergent_pumps.'.$index.'.xt', $pump->xt) }}">
                        </td>
                        <td>
                            <input type="text" class="form-control" name="detergent_pumps[{{ $index }}][total]" value="{{ old('detergent_pumps.'.$index.'.total', $pump->total) }}">
                        </td>
                        <td>
                            <input type="text" class="form-control" name="detergent_pumps[{{ $index }}][remaining]" value="{{ old('detergent_pumps.'.$index.'.remaining', $pump->remaining) }}">
                        </td>
                        <input type="hidden" name="detergent_pumps[{{ $index }}][id]" value="{{ $pump->id }}">
                    </tr>
                @endforeach
            </tbody>
        </table>

        <!-- Add more detergent pumps if needed -->

        <!-- Submit button -->
        <button type="submit" class="btn btn-primary">Update Device</button>
    </div>
</form>

web.php 文件就是这个:

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UserController;
use App\Http\Controllers\DeviceController;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "web" middleware group. Make something great!
|
*/



Route::get('/', function () {
    return view('welcome');
});


Route::get('/saveuser',[UserController::class,'saveuser']);


Route::get('/devices', [DeviceController::class, 'index'])->name('devices.index');
Route::get('/devices/create', [DeviceController::class, 'create'])->name('devices.create');
Route::get('/devices/{device}', [DeviceController::class, 'show'])->name('devices.show');
Route::post('/devices', [DeviceController::class, 'store'])->name('devices.store');
Route::get('/devices/{device}/edit', [DeviceController::class, 'edit'])->name('devices.edit');
Route::patch('/devices/{device}', [DeviceController::class, 'update'])->name('devices.update');

Route::delete('/devices/{device}', [DeviceController::class, 'destroy'])->name('devices.destroy');
Route::get('/process-all-json', [DeviceController::class, 'processJsonFile'])->name('devices.processJsonFile');

问题是代码在验证之前输入了 dd ,其中包含我在表单中输入的所有修改数据,这就是我将其注释掉的原因,但它没有到达第二个数据库。 验证有问题吗?

php json laravel validation crud
1个回答
0
投票

看起来,是的,如果您没有看到第二个

dd()
结果,则验证可能存在问题。

要准确确定哪个输入有错误,您可以在

edit.blade.php
文件顶部添加以下代码:

@if(!empty($errors->messages()))
    {{ dd($errors->messages()) }}
@endif

此外,要在

edit.blade.php
页面上显示代码错误,在查看有关在 Blade 中显示验证错误的 Laravel 文档后,您可以在每个输入旁边使用类似于以下的代码。提交表单后,这将显示其下方每个输入的错误:

@error("detergent_pumps." .$index. ".dosage")
    <div class="text-danger">{{ $message }}</div>
@enderror
© www.soinside.com 2019 - 2024. All rights reserved.