Laravel 用枚举属性填充给出错误
Laravel fill with enum attribute gives error
我有一个像这样的枚举:
<?php
namespace App\Models\helpers\Enums;
enum ComissionamentoVendedor: string
{
case Faturamento = 'No faturamento';
case Pagamento = 'Após o pagamento pelo cliente';
}
我有一个使用这个枚举的模型
...
public $casts = [
'comissionamento_momento' => ComissionamentoVendedor::class,
];
...
但是当我尝试保存它时出现错误:
$vendedor = new Vendedor;
$vendedor->fill($atributos);
$vendedor->save();
错误是ErrorException: Attempt to read property "value" on string
它发生在文件上 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;
}
我是不是做错了什么?我实际上使用的是 Lumen 8.3.3。
除非您可以升级在您的应用程序中使用的 Illuminate 库,否则您将无法让演员从字符串中为您获取枚举;你将不得不通过一个枚举。您可以使用 from
方法从字符串中获取所需的枚举:
$enum = ComissionamentoVendedor::from($value);
如果您不确定此值是否实际上是 Enum 的有效值,您可以使用 tryFrom
方法:
$enum = CommissionamentoVendedor::tryFrom($value) ?? $defaultEnum;
PHP.net Manual - Language Reference - Enumerations - Backed enumerations
Github - Laravel Framework - Commit - [8.x] Enum casts accept backed values 于 2021 年 11 月 15 日提交
我有一个像这样的枚举:
<?php
namespace App\Models\helpers\Enums;
enum ComissionamentoVendedor: string
{
case Faturamento = 'No faturamento';
case Pagamento = 'Após o pagamento pelo cliente';
}
我有一个使用这个枚举的模型
...
public $casts = [
'comissionamento_momento' => ComissionamentoVendedor::class,
];
...
但是当我尝试保存它时出现错误:
$vendedor = new Vendedor;
$vendedor->fill($atributos);
$vendedor->save();
错误是ErrorException: Attempt to read property "value" on string
它发生在文件上 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;
}
我是不是做错了什么?我实际上使用的是 Lumen 8.3.3。
除非您可以升级在您的应用程序中使用的 Illuminate 库,否则您将无法让演员从字符串中为您获取枚举;你将不得不通过一个枚举。您可以使用 from
方法从字符串中获取所需的枚举:
$enum = ComissionamentoVendedor::from($value);
如果您不确定此值是否实际上是 Enum 的有效值,您可以使用 tryFrom
方法:
$enum = CommissionamentoVendedor::tryFrom($value) ?? $defaultEnum;
PHP.net Manual - Language Reference - Enumerations - Backed enumerations
Github - Laravel Framework - Commit - [8.x] Enum casts accept backed values 于 2021 年 11 月 15 日提交