Laravel 8中关联belongsTo的双表导出Excel时用户名称不显示问题
解决方案
要在导出的Excel中显示关联用户的名称,需要修改OrderExport类,确保查询关联的User数据并将用户名称加入导出字段,同时更新表头。
方法一:使用Eloquent关联预加载(推荐,符合Laravel最佳实践)
修改OrderExport类的collection和headings方法:
<?php namespace App\Exports; use App\Models\Order; use Maatwebsite\Excel\Concerns\FromCollection; use Maatwebsite\Excel\Concerns\WithHeadings; class OrderExport implements FromCollection, WithHeadings { /** * @return \Illuminate\Support\Collection */ public function collection() { // 预加载user关联避免N+1查询,重组数据添加用户名称 return Order::with('user') ->select('id', 'user_id', 'phone', 'date', 'time', 'order_description') ->get() ->map(function ($order) { return [ 'id' => $order->id, 'user_id' => $order->user_id, 'user_name' => $order->user?->name ?? '无用户', // 兼容用户不存在的情况 'phone' => $order->phone, 'date' => $order->date, 'time' => $order->time, 'order_description' => $order->order_description ]; }); } public function headings(): array { return [ '#', '用户ID', '用户名称', '电话', '日期', '时间', '订单描述' ]; } }
方法二:使用数据库JOIN查询
如果仅需用户名称字段,可直接通过JOIN查询获取:
<?php namespace App\Exports; use Illuminate\Support\Facades\DB; use Maatwebsite\Excel\Concerns\FromCollection; use Maatwebsite\Excel\Concerns\WithHeadings; class OrderExport implements FromCollection, WithHeadings { /** * @return \Illuminate\Support\Collection */ public function collection() { return DB::table('orders') ->join('users', 'orders.user_id', '=', 'users.id') ->select( 'orders.id', 'orders.user_id', 'users.name as user_name', 'orders.phone', 'orders.date', 'orders.time', 'orders.order_description' ) ->get(); } public function headings(): array { return [ '#', '用户ID', '用户名称', '电话', '日期', '时间', '订单描述' ]; } }
说明
- 方法一使用Eloquent预加载关联,避免冗余查询,同时通过
map重组数据,兼容用户不存在的场景。 - 方法二直接用数据库JOIN查询,性能略优,但灵活性不如Eloquent关联,适合仅需单个关联字段的场景。
修改完成后重新导出Excel,即可看到用户名称字段正常显示。
内容的提问来源于stack exchange,提问作者Salah Ameen Aalasali
相关产品推荐
相关产品推荐

