21. Qué es asignación masiva

La asignación masiva (Mass Assignment) en Laravel se refiere a la técnica de asignar valores a múltiples atributos de un modelo de forma simultánea utilizando un solo arreglo de datos. En lugar de asignar los valores uno por uno, puedes usar la asignación masiva para asignar múltiples valores a la vez. Si bien esto es conveniente y ahorra tiempo, también puede ser peligroso ya que puede permitir la asignación de valores a atributos que no deberían ser accesibles para el usuario, como contraseñas o valores de administrador. Para abordar este problema, Laravel proporciona la función fillable y guarded en los modelos para especificar los atributos que pueden ser asignados de forma masiva o los que deben ser protegidos contra la asignación masiva. En el decimoctavo capítulo del curso "Laravel desde cero", aprenderás cómo utilizar la asignación masiva en Laravel y cómo proteger tu aplicación de vulnerabilidades de seguridad relacionadas con la asignación masiva. Con estos conocimientos, podrás utilizar la asignación masiva de manera segura y eficiente en tus aplicaciones Laravel.


3 comentarios

Inicia sesión para comentar

Comentarios:

  • Carlos Romero

    Carlos Romero hace 1 año

    Saludos!… presento un error en un camino pero si tomo otro funciona, igual quiero aprender y saber como soluciono el siguiente camino.

    Camino 01:

    public function store(StoreCurso $request){

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

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

    }

     

    Camino 02:

    public function store(StoreCurso $request){

            $curso = new Curso();

            $curso->name = $request->name;

            $curso->descripcion = $request->descripcion;

            $curso->categoria = $request->categoria;

            $curso->save();

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

    }

    Comentario:

    Camino 02 me funciona pero no uso asignación masiva, con el camino 01 el error es:

    Missing required parameter for [Route: cursos.show] [URI: cursos/{id}] [Missing parameter: id].

    Falta parámetro requerido para [Ruta: cursos.show] [URI: cursos/{id}] [Falta parámetro: id].

     

    Intentos:

    01:  Voy a web.php y modifico {id} por {curso}. Así:

    Route::controller(CursoController::class)->group(function(){

        Route::get('cursos', 'index')->name('cursos.index');

        Route::get('cursos/create', 'create')->name('cursos.create');

        Route::post('cursos','store')->name('cursos.store');

        Route::get('cursos/{curso}', 'show')->name('cursos.show');

        Route::get('cursos/{id}/edit', 'edit')->name('cursos.edit');

        Route::put('cursos/{id}','update')->name('cursos.update');

    });

    El error sigue similar:

    Missing required parameter for [Route: cursos.show] [URI: cursos/{curso}] [Missing parameter: curso].

     

    01: Edito CursoController.php

    public function store(StoreCurso $request){

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

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

    }

    El error ahora es:

    Attempt to read property "id" on null (Que intento leer una propiedad nula, y creo entender pues como va saber el id que asigno)

     

    Agradecería todo comentario al respecto, gracias!

    • Fernando hace 1 año

      Hola Carlos, en tu camino 1 me parece que pusiste una “d” adicional por eso te falla

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

      lo correcto seria 

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

  • Walter

    Walter hace 2 años

    ? Asignación masiva

          Nos permite reemplazar:

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

          Por sólo esta línea de código:

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

          Por cuestiones de seguridad, para que no se agreguen campos no deseados en nuestra tabla, debemos indicarle al modelo cuáles son las propiedades deseadas (autorizadas) para crear el objeto. Eso lo hacemos agregando en app\Models\Curso.php:

    	protected $fillable = [ 'name', 'description', 'categoria' ];

          Si la cantidad de propiedades es mucha podemos optar por usar:

    	protected $guarded = [ 'status' ];

          Podemos dejar el array vacío y aún así nos permitirá la asignación masiva.

     

          Ahora en el método update podemos reemplazar por:

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

     

  • Juan Carlos Montaña Garzon

    Juan Carlos Montaña Garzon hace 2 años

    una consulta, o mas bien error:

     

    al dejarle activo en el modelo protected $fillable…. me sale un error de que SQLSTATE[HY000]: General error: 1364 Field 'nombre' doesn't have a default value (SQL: insert into `cursos` (`updated_at`, `created_at`)

     

    pero cuando se deja activo protected $guarded=[]; me sale el error Argument 1 passed to Illuminate\Database\Grammar::parameterize() must be of the type array, string given, called in C:\xampp\htdocs\blog\vendor\laravel\framework\src\Illuminate\Database\Query\Grammars\Grammar.php on line 920.

     

     

    sin embargo, si se imprime el json cuando se envia return $request->all(); desde el controller

    • Johann Stig hace 2 años

      Hola, aunque ya ha pasado mucho tiempo desde tu pregunta igual te digo como me funcionó.

       

      Yo tenia la siguiente línea de código 

       

      $course = Course::create([$request->all()]);

       

      El error ocurría por el uso de [] en el llamado al método. Lo correcto es

       

      $course = Course::create($request->all());

       

      Así solucione el error.

       

      Salu2