如何使用 Maatwebsite 使模型中使用的 Select 函数动态 select 列导出到 Laravel 中的 excel

how to make Select function used in model dynamically select the column to export in excel in Laravel using Maatwebsite

我在项目中使用 Laravel 8 和 waatwebsite(与 excel 一起工作)。我的数据库中有一个 Table 名称文档,它有 20 列值。我不知道如何使 select() 函数动态化,以便我可以从控制器传递列名称以提取查询并转储我需要的列以供其他下载。

在这里,我下载了 excel 中的其他数据,其中包含不同的列,而不是 Lc_no、cur、value_date。

此外, constructor string $search,string $from, string $to 的参数如果没有通过controller传递,如何设置为null。

型号

    class UserExport implements FromQuery
    {
        use Exportable;
        /**
        * @return \Illuminate\Support\Collection
        */
    
    use Exportable;
    
    
    public function __construct(string $search,string $from, string $to)
        {
            
            $this->from = $from;
            $this->to = $to;
            $this->search = $search;
            
        }
    
        public function query()
        {
    
            return Doc::query()->wherebetween($this->search, [$this->from,$this->to])->select('lc_no', 'cur', 'value_date');
        }

控制器

class ExportController 扩展控制器 {

        function exports(){
            //return Excel::download(new UserExport, 'users.xlsx');
            return (new UserExport)->download('docs.xlsx');
        }
    
    
        function treasury_dump($from,$to)
        {
            $search = 'value_date';
                return (new UserExport($search,$from,$to))->download('treasury.xlsx');
    
    
        }

您可以传递数组作为参数而不是多个参数

public function __construct($params)
{
            
    $this->params = $params;
            
}
    
public function query()
{
    
    return Doc::query()->wherebetween($this->params['search'], [$this->params['from'],$this->params['to']])->select($this->params['columns']);
}

在你的控制器中

$params=[
'search'=>'asfsa',
'from'=>'',
'to'=>'',
'columns'=>['lc_no', 'cur', 'value_date']
];

return (new UserExport($params))->download('treasury.xlsx');    

但请确保如果您为搜索传递 null,from 和 to 查询将失败,因此在执行如下查询之前更好地检查

Doc::query()->where(function($query)use(){
if(isset($this->params['search'])&&!empty($this->params['search'])&&isset($this->params['from'])&&!empty($this->params['from'])&&isset($this->params['to'])&&!empty($this->params['to'])){
$query->wherebetween($this->params['search'], [$this->params['from'],$this->params['to']]);
}

)->select($this->params['columns']);

已更新

  Doc::query()->where(function($query) {
        if (isset($this->params['search']) && !empty($this->params['search']) && isset($this->params['from']) && !empty($this->params['from']) && isset($this->params['to']) && !empty($this->params['to'])) {
            $query->wherebetween($this->params['search'], [$this->params['from'], $this->params['to']]);
        }
    }
    )->select($this->params['columns']);