问题描述
我在项目中使用 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']);