TransWikia.com

¿Como realizar una asignación masiva?

Stack Overflow en español Asked by Jhon Piraquive on December 11, 2021

Estoy intentando realizar una asignación masiva es decir guardar un objeto con los datos ingresados desde el formulario, pero al intentar guardar me retorna un error como si no estuviera recibiendo el valor de un campo. Adjunto codigo de mi controlador, Form Request, Modelo y el error que genera lo que no entiendo es el porque no reconoce el atributo fillable.

Modelo, en este se define la tabla a la que apunta en la bd al igual que todos los campos serán fillable

<?php

namespace App;

use IlluminateDatabaseEloquentModel;

class Proveedor extends Model
{
    protected $table = 'proveedores';

    protected $fillable = ['*'];
}

Controlador, en este defino el form request al que se hará la petición para verificar los datos una vez este finaliza retorna al controlador los datos y allí en donde retorna el error que se presenta

 public function guardarProveedor(GuardarProveedorForm $request){
            // dd($request->input());
            $proveedor = new Proveedor();
            $proveedor->save($request->input());
        }

Form Request, en este reviso los datos que envío en el get y está parte va bien la adiciono por si el error pueda presentarse en este lugar

<?php

namespace AppHttpRequests;

use IlluminateFoundationHttpFormRequest;

class GuardarProveedorForm extends FormRequest
{
    public function authorize()
    {
        if(auth()->user()->hasRole("administrador"))
            return true;

        return false;
    }

    public function rules()
    {
        return [
            "tipo_identificacion" => "required",
            "identificacion" => "required",
            "nombre" => "required",
            "apellidos" => "required",
            "correo" => "required",
            "direccion" => "required",
            "ciudad" => "required",
            "telefono" => "required",
            "celular" => "required",
            "digito_verificacion" => "required_if:tipo_identificacion,==,nit",
            "titular" => "required",
            "tipo_pago" => "required",
            "nombre_tercero" => "required_if:titular,==,tercero",
            "banco" => "required_if:tipo_pago,==,banco",
            "numero_cuenta" => "required_if:tipo_pago,==,banco",
            "tipo_cuenta" => "required_if:tipo_pago,==,banco",
        ];
    }

    public function messages()
    {
        return [
            'tipo_identificacion.required' => 'El campo :attribute es obligatorio.',
            'identificacion.required' => 'El campo :attribute es obligatorio',
            'nombre.required' => 'El campo :attribute es obligatorio',
            'apellidos.required' => 'El campo :attribute es obligatorio',
            'correo.required' => 'El campo :attribute es obligatorio',
            'direccion.required' => 'El campo :attribute es obligatorio',
            'ciudad.required' => 'El campo :attribute es obligatorio',
            'telefono.required' => 'El campo :attribute es obligatorio',
            'celular.required' => 'El campo :attribute es obligatorio',
            'digito_verificacion.required_if' => 'El campo :attribute es obligatorio',
            'titular.required' => 'El campo :attribute es obligatorio',
            'tipo_pago.required' => 'El campo :attribute es obligatorio',
            'nombre_tercero.required_if' => 'El campo :attribute es obligatorio',
            'banco.required_if' => 'El campo :attribute es obligatorio',
            'numero_cuenta.required_if' => 'El campo :attribute es obligatorio',
            'tipo_cuenta.required_if' => 'El campo :attribute es obligatorio',
        ];
    }
}

SQLSTATE[HY000]: General error: 1364 Field ‘tipo_identificacion’ doesn’t have a default value (SQL: insert into proveedores (updated_at, created_at) values (2020-04-22 22:33:15, 2020-04-22 22:33:15))

One Answer

En la asignación masiva en Laravel pide lo siguiente:

  • Declarar en la propiedad $fillable del modelo aquellos atributos que se pueden asignart masivamente
  • Usar el método create en lugar del método save
  • Puedes usar $request->all() para recibir todos los valores y asignarlos masivamente
  • O bien puedes usar $request->only(); y pasar dentro de un vector aquellos valores que son los únicos que se pueden asignar masivamente.

Puedes proceder así:

En tu modelo

class Proveedor extends Model
{
    protected $table = 'proveedores';

    protected $fillable = ['atributo1', 'atributo2', ....., 'atributoN'];
}

En tu controlador:

 public function guardarProveedor(GuardarProveedorForm $request)
 {
            // dd($request->input());
            $proveedor = Proveedor::create($request->all());
 }

Answered by BetaM on December 11, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP