Did you add name and damage to $fillable in your PlayerSeason Model?
protected $fillable = [
'name',
'damage'
];
Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.
Framework: Laravel, Inertia, Vue, Ziggy. Something went wrong, it doesn't update the data, I can see the data from the form. When I changed the value in the form and then submitted and redirected to player.index and the flash said "player updated". Validation works. What am I missing?
Route:list PUT|PATCH...player/{player}...player.update › PlayerSeasonController@update
Status Code: 303 See Other, Request URL:
http://127.0.0.1:8000/player/1
Request Method:
PUT
web.php
Route::resource('/player', PlayerSeasonController::class);
PlayerSeasonController.php
public function update(Request $request, PlayerSeason $playerSeason)
{
$playerSeason->update(
$request->validate([
'name' => 'min:3|max:32|string',
'damage' => 'required|integer|min:0'
])
);
return redirect()->route('player.index')
->with('success', 'gracz zaktualizowany');
}
public function edit(Request $request, $player_id)
{
$player = PlayerSeason::with('user', 'guild')->find($player_id);
return inertia('Player/Edit',
[
'player' => $player
]);
}
Edit.vue
<template>
<div class="grid container mx-auto p-4 place-items-center border-2 border-sky-500 rounded-md ">
<p>Info player:</p>
<p>Username: {{ player.user.name }}</p>
<p>Guild: {{ player.guild.name }}</p>
<p>ID user: {{ player.user.id }}</p>
<p>ID player: {{ player.id }}</p>
</div>
<form class="grid grid-cols-6 grid-cols-subgrid h-screen justify-center" @submit.prevent="update" >
<div class="text-center">
<div>
<label class="label">Username</label>
<input v-model.number="form.name" type="text" class="text-center shadow-md" />
<div v-if="form.errors.name">
{{ form.errors.name }}
</div>
</div>
<div>
<label class="label">Damage</label>
<input v-model.number="form.damage" type="text" class="text-center shadow-md" />
<div v-if="form.errors.damage">
{{ form.errors.damage }}
</div>
</div>
<div>
<button class="btn mt-3" type="submit">Update</button>
</div>
</div>
</form>
</template>
<script setup>
import { useForm } from '@inertiajs/vue3'
import { route } from "ziggy-js";
const props = defineProps({
player: Object
})
const form = useForm({
name: props.player.user.name,
damage: props.player.damage,
})
const update = () => {
form.put(route('player.update', { player: props.player.id }))
}
</script>
@jaseofspades88 I fixed this: Before:
public function update(Request $request, PlayerSeason $playerSeason)
{
$validatedData = $request->validate([
'name' => 'min:3|max:32|string',
'damage' => 'required|integer|min:0'
]);
$affected = $playerSeason->update($validatedData);
if ($affected) {
return redirect()->route('player.index')
->with('success', 'player has been updated.');
} else {
return dd($playerSeason);
}
}
After:
public function update(Request $request, $player_id)
{
$playerSeason = PlayerSeason::findOrFail($player_id);
$validatedData = $request->validate([
'name' => 'min:3|max:32|string',
'damage' => 'required|integer|min:0|max:100000000'
]);
if (isset($validatedData['name'])) {
$playerSeason->user()->update(['name' => $validatedData['name']]);
unset($validatedData['name']);
}
$affected = $playerSeason->update($validatedData);
return redirect()->route('player.index')
->with('success', 'Player has been updated.');
}
I think i messed up with tabels SQL and i got rid of this PlayerSeason $playerSeason to $player_id. name is from users and damage is from player_seasons
Please or to participate in this conversation.