Laravel: Asignación masiva formularios (parte 16)

Archivos:

  • resources/views/cursos/create.blade.php

Actualizando método store

Si un formulario tuviese muchísimos campos, resultaría tedioso asignar cada campo a un valor dentro del método del controlador. Para ello podemos asignar todos los campos con una única línea de código, aunque para ello tendremos que tomar ciertas medidas de seguridad.

En el método store, creábamos un objeto Curso y asignábamos los valores provenientes del formulario con las siguientes líneas, y lo salvábamos en la base de datos:

$curso = new Curso();

$curso ->name= $request->name;
$curso ->description= $request->description;
$curso ->categoria= $request->categoria;
$curso ->save();

Ahora usaremos un método llamado create() al que pasaremos como parámetro un array:

        $curso = Curso::create([
            'name' => $request->name,
            'description' => $request->description,
            'categoria' => $request->categoria
        ]);

Lo cual se puede escribir mucho más sencillo así:

        $curso = Curso::create($request->all());

Pero si intentamos ahora usar el formulario obtendremos el siguiente error:

Add [_token] to fillable property to allow mass assignment on [App\Models\Curso].

Así que esto nos dice que, por seguridad, tendremos que especificar qué campos se pueden rellenar y qué no en nuestra base de datos – ya que estamos mandando todos los campos al mismo tiempo, sin importar cuántos ni cuáles. Esto lo podemos hacer de dos formas: usando la propiedad fillable o la propiedad guarded en el módulo Curso.

Propiedad fillable

Así especificamos qué campos queremos que se puedan rellenar:

class Curso extends Model
{
    use HasFactory;
    protected $fillable = ['name','description','categoria'];
}

(Ponemos campos permitidos e ignoramos lo campos protegidos)

Propiedad guarded

Así especificamos qué campos no queremos que se puedan rellenar, lo cual es bastante útil ahora mismo para ahorrar código:

class Curso extends Model
{
    use HasFactory;
    protected $guarded = ['status'];
}

Esto es útil si, por ejemplo, tuviéramos un campo llamado status cuya función sería que el registro se mostrara o no, y estuviera pendiente de ser aprobado o no mientras este campo tuviera cierto valor o se modificara. En nuestro caso, aún no tenemos establecido nada de esto y podemos dejarlo así:

class Curso extends Model
{
    use HasFactory;
    protected $guarded = [];
}

(Ponemos campos protegidos e ignoramos lo campos permitidos)

Actualizando método update

Vamos al método update, para editar registros, y lo modificamos de la siguiente manera: comentamos todas las líneas de creación de objeto y asignación, y le pasamos el método update al objeto $curso que hemos creado, pasándole como parámetro el array de request:

public function update(Request $request, Curso $curso) {
        // return $request->all();

        $request->validate([
            'name' => 'required',
            'description' => 'required',
            'categoria' => 'required',
        ]);

        // $curso->name = $request->name;
        // $curso->description = $request->description;
        // $curso->categoria = $request->categoria;

        // $curso->save();

        $curso->update($request->all());

        return redirect()->route('cursos.show',$curso->id);

    }

Recursos:

Enlace de Youtube: https://www.youtube.com/watch?v=n_C_HFqS8XY&list=PLZ2ovOgdI-kWWS9aq8mfUDkJRfYib-SvF&index=22