You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 06:50:08