Laravel问题:如何将Status Enum数值转为DataTable显示的文本
问题:Laravel DataTable中状态数值无法转换为文本显示
我正在开发一个Laravel项目,数据库中有一个名为status的字段,其值为1、2、3,希望在UI的DataTable中将这些数值转换为Active、Inactive、Pending显示。
现有代码
CompanyLabel Model代码
namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use App\Models\Enums\CompanyLabel\StatusEnum; class CompanyLabel extends Model { use HasFactory; protected $fillable = [ 'status', ]; protected $casts = [ 'status' => StatusEnum::class, ]; public function scopeActive($query) { return $query->whereIn('company_labels.status', StatusEnum::getCompanyLabelStatus()); } }
StatusEnum枚举代码
namespace App\Models\Enums\CompanyLabel; enum StatusEnum: int { case Active = 1; case Inactive = 2; case Pending = 3; public function str(): string { return match ($this) { self::Active => 'Active', self::Inactive => 'Inactive', self::Pending => 'Pending', }; } public static function getCompanyLabelStatus() { return [ self::Active->value => self::Active->str(), self::Inactive->value => self::Inactive->str(), self::Pending->value => self::Pending->str(), ]; } }
但UI上DataTable的status仍显示数值而非对应文本,请求协助解决该问题。
更新:DataTable数据返回代码
$records = MyTable::whereIn('mytable.status',array(1,2)) ->select('mytable.status') ->get(); $dataArray = array(); foreach ($records as $record) { $dataArray[] = array( 'status' => $record->status, ); } $response = array( "aaData" => $dataArray ); return response()->json([ 'status' => 0, 'data' => $response, 'message' => 'Success' ]);
解决方法
问题核心是你DataTable使用的MyTable模型未配置枚举转换,导致$record->status始终是原始数值,没有转成枚举实例。以下是几种可行方案:
方案一:给MyTable模型添加枚举转换
把CompanyLabel里的枚举配置复制到MyTable模型中:
namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use App\Models\Enums\CompanyLabel\StatusEnum; class MyTable extends Model { use HasFactory; // 新增枚举转换配置 protected $casts = [ 'status' => StatusEnum::class, ]; }
之后在循环里调用枚举的str()方法获取文本:
$dataArray[] = array( 'status' => $record->status->str(), );
方案二:手动转换数值为文本(无需修改模型)
如果不想改动MyTable模型,直接在数据处理环节用枚举类转换:
首先在当前文件顶部引入StatusEnum:
use App\Models\Enums\CompanyLabel\StatusEnum;
然后修改循环中的status赋值:
$dataArray[] = array( 'status' => StatusEnum::from($record->status)->str(), );
方案三:用枚举的键值对数组映射
直接使用getCompanyLabelStatus()返回的数组做数值到文本的映射:
$dataArray[] = array( 'status' => StatusEnum::getCompanyLabelStatus()[$record->status], );
内容的提问来源于stack exchange,提问作者RA.IBOY
相关产品推荐
相关产品推荐

