微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用Maatwebsite使模型中使用的Select函数在Laravel中动态选择要在excel中导出的列

如何解决如何使用Maatwebsite使模型中使用的Select函数在Laravel中动态选择要在excel中导出的列

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

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

还有, 如果不通过控制器,如何将构造函数字符串 $search,string $from,string $to 的参数设置为 null。

模型

    class UserExport implements FromQuery
    {
        use Exportable;
        /**
        * @return \Illuminate\Support\Collection
        */
    
    use Exportable;
    
    
    public function __construct(string $search,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');    

但请确保如果您为搜索传递空值,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['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['to']]);
        }
    }
    )->select($this->params['columns']);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。