Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel fill with enum attribute gives error

I have an Enum like:

<?php

namespace App\Models\helpers\Enums;

enum ComissionamentoVendedor: string
{
    case Faturamento = 'No faturamento';
    case Pagamento = 'Após o pagamento pelo cliente';
}

And I have a model that uses this Enum

...
    public $casts = [
        'comissionamento_momento' => ComissionamentoVendedor::class,
    ];
...

But when I try to save it I get an error:

$vendedor = new Vendedor;
$vendedor->fill($atributos);
$vendedor->save();

The error is ErrorException: Attempt to read property "value" on string

It happens on the file vendor/illuminate/database/Eloquent/Concerns/HasAttributes.php:951

 protected function setEnumCastableAttribute($key, $value)
 {
     // $value here is a string, a valid value from ComissionamentoVendedor Enum, sent by the frontend but looks like Laravel expects to be an Enum
     $this->attributes[$key] = isset($value) ? $value->value : null;
 }

Am I doing something wrong? I'm actually using Lumen 8.3.3.

like image 485
Jhonatan Bianchi Avatar asked Dec 18 '25 23:12

Jhonatan Bianchi


1 Answers

Unless you can upgrade the Illuminate libraries being used in your application you don't have the feature of the ability to have the cast get an Enum from a string for you; you will have to pass an Enum. You can get the Enum you need from a string using the from method:

$enum = ComissionamentoVendedor::from($value);

If you are not sure if this value is actually a valid value for the Enum you can use the tryFrom method:

$enum = CommissionamentoVendedor::tryFrom($value) ?? $defaultEnum;

PHP.net Manual - Language Reference - Enumerations - Backed enumerations

Github - Laravel Framework - Commit - [8.x] Enum casts accept backed values committed on Nov 15, 2021

like image 167
lagbox Avatar answered Dec 20 '25 20:12

lagbox