I’m trying to implement a simple Update form in laravel, but the table field 'id'
has to be called 'codigo'
instead. The SQL sentence sent to the database searches for an id
with the WHERE
statement, but I’m not looking for an id
but a codigo
, and that’s where I don’t know how to change the sql statement.
This is my EstudianteController
update function
public function update(Request $request, $codigo)
{
$estudiante = Estudiante::where('codigo', $codigo)->firstOrFail();
$request->validate([
'codigo' => 'required',
'apellidos' => 'required|string|max:255',
'nombres' => 'required|string|max:255',
'edad' => 'required|integer',
'direccion' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:estudiantes,email,' . $codigo . ',codigo',
'fechanacimiento' => 'required|date',
]);
$estudiante->update($request->all());
return redirect()->route('estudiantes.index')
->with('success', 'Estudiante actualizado correctamente.');
}
My Estudiante model
<?php
namespace AppModels;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
class Estudiante extends Model
{
use HasFactory;
protected $primarykey = 'codigo';
public $incrementing = false;
protected $fillable = [
'apellidos', 'nombres', 'edad', 'direccion', 'email', 'fechanacimiento'
];
}
And my edit.blade.php
form
@extends('layouts.app')
@section('title', 'Editar Estudiante')
@section('content')
<h1>Editar Estudiante</h1>
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form action="{{ route('estudiantes.update', $estudiante->codigo) }}" method="POST">
@csrf
@method('PUT')
<input type="hidden" name="codigo" id="codigo" value="{{ $estudiante->codigo }}">
<div>
<label for="apellidos">Apellidos:</label>
<input type="text" name="apellidos" id="apellidos" value="{{ old('apellidos', $estudiante->apellidos) }}" required>
</div>
<div>
<label for="nombres">Nombres:</label>
<input type="text" name="nombres" id="nombres" value="{{ old('nombres', $estudiante->nombres) }}" required>
</div>
<div>
<label for="edad">Edad:</label>
<input type="number" name="edad" id="edad" value="{{ old('edad', $estudiante->edad) }}" required>
</div>
<div>
<label for="direccion">Dirección:</label>
<input type="text" name="direccion" id="direccion" value="{{ old('direccion', $estudiante->direccion) }}" required>
</div>
<div>
<label for="email">Email:</label>
<input type="email" name="email" id="email" value="{{ old('email', $estudiante->email) }}" required>
</div>
<div>
<label for="fechanacimiento">Fecha de Nacimiento:</label>
<input type="date" name="fechanacimiento" id="fechanacimiento" value="{{ old('fechanacimiento', $estudiante->fechanacimiento) }}" required>
</div>
<button type="submit">Actualizar</button>
</form>
@endsection
The error thrown by laravel is the following:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'id' in 'where clause'
update
`estudiantes`
SET
`direccion` = Mar del Plata,
`estudiantes`.`updated_at` = 2024 -05 -22 17: 31: 34
WHERE
`id` IS NULL
and I want it to look like this:
update
`estudiantes`
SET
`direccion` = Mar del Plata,
`estudiantes`.`updated_at` = 2024 -05 -22 17: 31: 34
WHERE
`codigo` IS 4