как сделать функцию выбора, используемую в модели, динамически выбирать столбец для экспорта в Excel в Laravel с помощью Maatwebsite

Я работаю в проекте, используя 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 $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 расширяет Controller {

        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');
    
    
        }

person sudeep Acharya    schedule 30.05.2021    source источник


Ответы (1)


Вы можете передать массив в качестве параметра вместо нескольких параметров

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 для поиска, запрос от и до не удастся, поэтому лучше проверьте перед выполнением запроса, как показано ниже.

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']);
person John Lobo    schedule 30.05.2021
comment
Спасибо .. это сработало .. но второй запрос говорит об ошибке синтаксиса. для проверки нулевого значения для поиска от и до. - person sudeep Acharya; 30.05.2021
comment
проверьте любую синтаксическую ошибку в моем коде или в какой строке она выдает ошибку - person John Lobo; 30.05.2021
comment
в первой строке ..... синтаксическая ошибка, неожиданная ')', ожидается '&' или переменная (T_VARIABLE) - person sudeep Acharya; 30.05.2021
comment
обновлен ответ на изменения - person John Lobo; 30.05.2021
comment
Многие, Большое спасибо .. Брат, мне очень неловко даже просить тебя исправить синтаксическую ошибку .. Я новичок в программировании .. видя все эти вложенные функции меня смущает .....: D - person sudeep Acharya; 30.05.2021
comment
он работает. если он работает, примите и проголосуйте за ответ - person John Lobo; 30.05.2021
comment
У меня было бы, но у меня недостаточно репутации, чтобы проголосовать ... Я сделаю это с другого аккаунта - person sudeep Acharya; 30.05.2021
comment
Вы можете принять ответ, я думаю, даже если у вас недостаточно очков - person John Lobo; 30.05.2021
comment
проголосовал за вас из другого моего аккаунта .... - person sudeep Acharya; 30.05.2021