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

Laravel邮件中无法调用数据库数组变量?求解决方案

在Laravel邮件组件中引入数据库数组数据的解决方案

问题根源

你当前代码的核心问题是:DB::table('Requests')->where('id', $id)->get() 返回的是**集合(Collection)**而非单个数据对象,集合没有直接的name属性,因此在邮件视图中调用$request->name会报错。同时,你重复查询了两次数据库,完全可以优化。

修复步骤

1. 优化控制器查询逻辑

将控制器中的查询改为获取单个数据对象,避免重复查询:

// 一次查询获取单条记录
$request = DB::table('Requests')->where('id', $id)->first();

// 先判断记录是否存在,避免空指针错误
if (!$request) {
    abort(404, '请求记录不存在');
}

// 直接使用查询结果中的email字段
Mail::to($request->email)->send(new Order($request));

2. 完善邮件类(Order.php)

确保邮件类通过构造函数接收数据,并将其暴露为公共属性(Laravel会自动将公共属性传递到邮件视图):

<?php

namespace App\Mail;

use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class Order extends Mailable
{
    use SerializesModels;

    // 定义公共属性,自动传递到视图
    public $request;

    /**
     * 构造函数接收数据
     */
    public function __construct($request)
    {
        $this->request = $request;
    }

    /**
     * 构建邮件内容
     */
    public function build()
    {
        // 指定邮件视图文件(需确保视图路径正确)
        return $this->view('emails.order');
    }
}

3. 邮件视图正常调用数据

在你的邮件视图文件(如resources/views/emails/order.blade.php)中,直接使用传递过来的对象属性:

Dear {{ $request->name }}

补充:使用with()方法传递数据(可选)

如果你不想使用公共属性,也可以在build()方法中通过with()手动传递数据:

public function build()
{
    return $this->view('emails.order')
                ->with([
                    'request' => $this->request
                ]);
}

内容的提问来源于stack exchange,提问作者Niek Neuvel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:15:07