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

Laravel项目中如何将发票状态数字转为文字显示在邮件里?

给你几种实用的实现方案,按需选择即可:

方案1:模型访问器(推荐,复用性最高)

在你的Invoice模型中添加一个访问器,自动将数字状态转换为对应文字描述:

// app/Models/Invoice.php
public function getStatusTextAttribute()
{
    $statusMap = [
        0 => 'Pending',
        1 => 'In Process',
        2 => 'Completed',
        3 => 'Cancelled'
    ];

    return $statusMap[$this->status] ?? 'Unknown';
}

之后不管是控制器还是邮件模板,直接调用$invoice->status_text就能拿到对应文字。比如在邮件模板invStatusUpdate.blade.php中:

<p>Your invoice status has been updated to: {{ $invoice->status_text }}</p>
方案2:控制器中处理后传递给视图

如果不想修改模型,可在TemplateController的状态更新方法中先转换状态文字,再传递给邮件:

// app/Http/Controllers/TemplateController.php
public function updateStatus(Request $request, Invoice $invoice)
{
    // 执行状态更新逻辑
    $invoice->update(['status' => $request->status]);

    // 定义状态映射关系
    $statusMap = [
        0 => 'Pending',
        1 => 'In Process',
        2 => 'Completed',
        3 => 'Cancelled'
    ];
    $statusText = $statusMap[$invoice->status] ?? 'Unknown';

    // 发送邮件时传递转换后的状态文字
    Mail::to($invoice->customer_email)->send(new InvoiceStatusUpdated($invoice, $statusText));
}

在邮件类中接收$statusText并传递给模板,模板直接输出即可:

<p>Your invoice status has been updated to: {{ $statusText }}</p>
方案3:直接在邮件模板中判断

如果仅需在邮件模板中使用,可直接在invStatusUpdate.blade.php里写条件判断:

<p>Your invoice status has been updated to: 
    @switch($invoice->status)
        @case(0)
            Pending
            @break
        @case(1)
            In Process
            @break
        @case(2)
            Completed
            @break
        @case(3)
            Cancelled
            @break
        @default
            Unknown
    @endswitch
</p>

也可以用@if链式判断实现相同效果:

<p>Your invoice status has been updated to: 
    @if($invoice->status == 0)
        Pending
    @elseif($invoice->status == 1)
        In Process
    @elseif($invoice->status == 2)
        Completed
    @elseif($invoice->status == 3)
        Cancelled
    @else
        Unknown
    @endif
</p>
方案4:使用枚举类(Laravel 8+ 推荐,规范状态管理)

如果项目是Laravel 8及以上版本,可用枚举类统一管理状态:

  1. 创建枚举类:
// app/Enums/InvoiceStatus.php
namespace App\Enums;

enum InvoiceStatus: int
{
    case Pending = 0;
    case InProcess = 1;
    case Completed = 2;
    case Cancelled = 3;

    public function label(): string
    {
        return match($this) {
            self::Pending => 'Pending',
            self::InProcess => 'In Process',
            self::Completed => 'Completed',
            self::Cancelled => 'Cancelled',
        };
    }
}
  1. 在模型中关联枚举(可选,强制状态值合法):
// app/Models/Invoice.php
use App\Enums\InvoiceStatus;

protected $casts = [
    'status' => InvoiceStatus::class,
];
  1. 使用时直接调用label()方法:
{{ $invoice->status->label() }}

或者在控制器中转换:

$statusText = InvoiceStatus::from($invoice->status)->label();

内容的提问来源于stack exchange,提问作者Haseeb Hassan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 14:33:21