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及以上版本,可用枚举类统一管理状态:
- 创建枚举类:
// 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', }; } }
- 在模型中关联枚举(可选,强制状态值合法):
// app/Models/Invoice.php use App\Enums\InvoiceStatus; protected $casts = [ 'status' => InvoiceStatus::class, ];
- 使用时直接调用
label()方法:
{{ $invoice->status->label() }}
或者在控制器中转换:
$statusText = InvoiceStatus::from($invoice->status)->label();
内容的提问来源于stack exchange,提问作者Haseeb Hassan
相关产品推荐
相关产品推荐

