使用 PHPExcel (maatwebsite/excel) 和 Laravel 9 从 Mysql 数据创建 Excel 矩阵

问题描述 投票:0回答:1

我正在尝试从我的数据库创建一个 Excel 文件,如下所示:

用户名 用户姓氏 A组 B组 X组
约翰 母鹿 X X
母鹿 X

我有3张桌子: 一个用户表、一个组表和一个将 user_id 和 group_id 匹配为用户的组匹配表可以有多个组。

我通过查询组列表并将“用户名”和“用户姓氏”附加到标头数组来成功动态构造标头

public function headings(): array
    {
        $header = array();
        $search ="Group";
        $groupList = new \App\Models\Group;
        $groupList = $groupList::where('name','LIKE',"%{$search}%")->get();;
        foreach($groupList as $key=>$value)  {
            $header[]=$value["name"];    
        }
        array_unshift($header,"User Name", "User Lastname");

        return $header;
    }

请注意,我无法控制将输出的组数。

接下来,我的记录集合返回一个包含用户名、姓氏和组成员身份的数组。

    public function array(): array
    {
        $datas = array();
        $MyUsers = MyUser::with(['groupMatching'])->get();
        foreach($MyUsers as $MyUser) {
           
            $datas[$MyUser->id]["name"] = $MyUser->lastname;
            $datas[$MyUser->id]["firstname"] = $MyUser->firstname;
            foreach($MyUser->groupMatching as $MyMember) {
                $datas[$MyUser->id]["groups"][]  = $MyMember->Group_name;

            }

            
        }
        return $datas;
    }

所以 $datas 看起来像这样:

array:23 [▼ // app/Exports/MyUsersExport.php:31
  4 => array:3 [▼
    "name" => "Doe"
    "firstname" => "John"
    "groups" => array:3 [▼
      0 => "Group A"
      1 => "Group X"
    ]
  5 => array:3 [▼
    "name" => "Jane"
    "firstname" => "Doe"
    "groups" => array:2 [▼
      0 => "Group X"
    ]
  ]
  ]

实现图示输出的下一步是什么?如何在匹配的列名称/数据上获得 X?

我尝试四处寻找地图功能和一些示例,但找不到要走的路。我正在使用 laravel 9 和 maatwebsite/excel 3.1

谢谢您的帮助:)

laravel matrix phpexcel array-map
1个回答
0
投票

由于您无法为特定列设置行值,因此我建议在类中声明

$groupList
变量,然后将其填充到
headings
方法中。然后在
array
方法中循环所有组并搜索用户是否属于该组。

public function array(): array
{
    $datas = array();
    $MyUsers = MyUser::with(['groupMatching'])->get();

    foreach($MyUsers as $MyUser) {
        $datas[$MyUser->id][] = $MyUser->lastname;
        $datas[$MyUser->id][] = $MyUser->firstname;

        foreach ($this->groupList as $groupItem) {
            $exists = (bool) $MyUser->groupMatching->firstWhere('Group_name', $groupItem['name']);

            $datas[$MyUser->id][] = $exists ? 'X' : '';
        }
    }

    return $datas;
}
© www.soinside.com 2019 - 2024. All rights reserved.