ok so what i did is an app that consumes the json files from storage and puts them as items into the db for dish washing machines. the json handleing and consuming went fine, all the routes went fine aside from editing the current items from the database: the code from the DeviceController is here:
<?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.');
}
}
the edit.blade.php file is this one:
<!-- 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>
and the web.php file is this one:
<?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');
the thing is the the code enters the dd before the validation with all the modified data that i input in the form and that's why i commented it out, but it does not get to the second db. Is there a problem with the validation?