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
相关产品推荐
相关产品推荐

