Laravel:保存方法不起作用

时间:2018-04-05 15:17:04

标签: php laravel

我尝试使用此方法save保存/更新数据,但它不起作用,它说参数没有默认值,但我发送它作为我想要插入/更新的一部分。这是我的代码

public function store(Request $request)
    {
        $producto_nombre = Producto_nombre::where('codigo', $request->codigo)->first();
        $reglas = [];
        //Comprobar unique en update
        if (isset($producto_nombre)) {
            $reglas = [
                'codigo' => [
                    'required',
                    Rule::unique('producto_nombre')->ignore($producto_nombre->id),
                ],
                'descripcion' => 'required'];
        } else {
            $reglas = ['descripcion' => 'required', 'codigo' => 'required|unique:producto_nombre'];
        }
        $validator = Validator::make($request->all(), $reglas);
        if ($validator->fails()) {
            return response()->json(array('errors' => $validator->getMessageBag()->toArray()));
        } else {
            $collection = $request->all();
            $this->agregarProducto($collection);

        }
    }


    public function agregarProducto($collection)
    {
        $producto_nombre = Producto_nombre::where('codigo', 
                           $collection['codigo'])->first();
        $empresa = Empresa::where('id', $collection['empresa_id'])->first();
        //Si esta vacio crea una nuevo
        if (empty($producto_nombre)) {
            $producto_nombre = new Producto_nombre();
        }

        $collection['iva_id'] = Iva::where('actual', 1)->first()->id;
//        dd($collection);
//        $producto_nombre->iva_id = Iva::where('actual', 1)->first()->id;
        $producto_nombre->save($collection);
        $producto = $empresa->productos()->where('producto_nombre_id',                 
                     $producto_nombre->id)->first();
        // Si esta vacio crea nuevo producto
        if (empty($producto)) {
            $producto = new Producto();
            $this->crearProductoSucursales($producto_nombre->id, 
                                           $collection['empresa_id']);
        }
        $producto->producto_nombre_id = $producto_nombre->id;
//            TODO editar en transferencias y compras en 0 maximo y minimo
        $producto->stock_maximo = $collection['stock_maximo'];
        $producto->stock_minimo = $collection['stock_minimo'];
        $producto->descuento = $collection['descuento'];
        $producto->save();
        $empresa->productos()->syncWithoutDetaching($producto->id);
    }

这是$ collection的内容

array:13 [
  "codigo" => "prueba"
  "descripcion" => "prueba"
  "con_iva" => "1"
  "desglose" => "0"
  "costo_actual" => "12"
  "precio" => "19.64"
  "descuento" => "12"
  "costo_promedio" => "0"
  "maximo" => "45"
  "minimo" => "2"
  "linea" => "2"
  "seccion" => "2"
  "empresa_id" => "2"
]

我已创建方法agregarProducto,因为我想在其他控制器中重复使用

更新

错误说:

  

" message":" SQLSTATE [HY000]:一般错误:1364 Field' codigo'没有默认值(SQL:insert into producto_nombre (updated_at, created_at) values (2018-04-05 10:09:28, 2018-04-05 10:09:28))",

1 个答案:

答案 0 :(得分:4)

转到课程Producto_nombre并添加:

class Producto_nombre
{
...
    protected $fillable = ['codigo'];
...

然后替换

$producto_nombre->save($collection);

$producto_nombre->fill($collection);
$producto_nombre->save();

方法save()的参数适用于禁用时间戳和其他选项。在您的情况下,您尝试使用数组中的数据填充对象,因此您必须使用fill($collection),或者如果它是新的注册表,您可以使用create($collection)