Laravel-Excel 导出关系数据

Laravel-Excel export relationship data

我正在尝试将记录导出到查询关系的 CSV,但我的文件只返回标题。

我正在使用 laravel-excel 包来做这个。

控制器方法

public function export(Team $team)
{
    return Excel::download(new TeamMembersExport(), 'team_members.csv');
}

团队方法

public function members(){
    return User::with('games')->whereHas('games', function ($q) {
        $q->where('team_id', $this->id);
    })->get();
}

导出文件

class ProviderMembersExport implements WithMapping, WithHeadings
{
    public function map($team): array
    {
        $members = $team->members()->only([
            'name',
            'team_number',
            'date_of_birth'
        ]);

        return $members->all();
    }

    public function headings(): array
    {
        return [
            'Name',
            'Team Number',
            'Date of Birth'
        ];
    }
}

我是不是在映射方法里面写错了?

有几个问题很突出。

  1. 您永远不会将 $team 传递给导出,我认为这是基于控制器方法的目标。
  2. 映射要求首先使用 From 关注点之一将数据填充到导出实例中:FromQueryFromCollectionFromArrayFromView
  3. 映射应该 return 一个数组,如方法签名中所示。此数组应代表导出中的单行,而不是整个查询响应。

好消息是,这一切都可以通过一些调整来解决。

控制器

public function export(Team $team)
{
    // pass the team model into the export
    return Excel::download(new TeamMembersExport($team), 'team_members.csv');
}

导出

// add FromCollection concern
class ProviderMembersExport implements FromCollection, WithMapping, WithHeadings
{
    use Exportable;

    // a place to store the team dependency
    private $team;

    // use constructor to handle dependency injection
    public function __construct(Team $team)
    {
        $this->team = $team;
    }

    // set the collection of members to export
    public function collection()
    {
        return $this->team->members();
    }

    // map what a single member row should look like
    // this method will iterate over each collection item
    public function map($member): array
    {
        return [
            $member->name,
            $member->team_number,
            $member->date_of_birth,
        ];
    }

    // this is fine
    public function headings(): array
    {
        return [
            'Name',
            'Team Number',
            'Date of Birth'
        ];
    }
}