Laravel-excel: [BUG] глобальные области не применяются при экспорте

Созданный на 25 июн. 2020  ·  19Комментарии  ·  Источник: Maatwebsite/Laravel-Excel

Предпосылки

  • [x] Проверено, поддерживается ли ваша версия Laravel Excel по-прежнему: https://docs.laravel-excel.com/3.1/getting-started/support.html#supported -versions
  • [x] Возможность воспроизвести поведение за пределами вашего кода, проблема изолирована в Laravel Excel.
  • [x] Проверено, что ваша проблема еще не отправлена.
  • [x] Проверено, не был ли отправлен PR, который решает эту проблему.
  • [x] Заполнен весь шаблон проблемы.

Версии

  • Версия PHP: PHP 7.4.7 (cli) (built: Jun 12 2020 00:00:24) ( NTS )
  • Версия Laravel: Laravel Framework 7.17.2
  • Версия пакета: 3.1.19

Описание

package не соблюдает глобальные области при экспорте ex.

protected static function booted()
    {
        static::addGlobalScope('latest_items', function (Builder $builder) {
            $builder->latest(
                $builder->qualifyColumn('created_at')
            );
        });
    }

запрос правильный напр.

select * from `requests` order by `requests`.`created_at` desc  

но экспортированный лист не сортируется.

Действия по воспроизведению

  • добавить данные с разными датами
  • добавить globalscope в ordeby
  • экспортировать лист через query

Ожидаемое поведение:

  • globalscopes следует уважать.

Фактическое поведение:

  • лист не отсортирован по глобальскопу.

Все 19 Комментарий

Мне нужно было бы увидеть немного больше кода, я не уверен, на что указывает «статика», и я не вижу, какой тип запроса вы используете.

запрос прост как Request::query() а статика - это глобальная область действия модели, пример обновлен

Можете ли вы попробовать поместить эту глобальную область в поставщик услуг, я не уверен, что загруженные обратные вызовы вызываются из-за соображений производительности.

на самом деле booted - это правильное место https://laravel.com/docs/master/eloquent#global -scopes

Я не говорю, что это не так. Я пытаюсь выяснить, почему его не называют.

да, я понимаю, нп, я попробую.

обратите внимание, что использование через поставщика услуг приведет к тому, что fw потребуется больше времени для разрешения класса и его привязки b4, использующей его.

извините за поздний ответ, попробовал поставщика услуг, но, к сожалению, дал тот же результат.

Вы используете из запроса и должны стоять в очереди?

с использованием FromQuery да и нет очереди

Я считаю, что проблема связана с функцией экспорта, а не с запросом, потому что я могу получить правильный sql.

Кажется, что методы chunk / chunkById Laravel не уважают глобальные области. Они работают, когда я указываю orderBy в самом запросе.

Вы можете попробовать воспроизвести без этого пакета и увидеть:

$first = Request::query()->first();
Request::query()->chunk(100, function($chunk) use($first) {

// Compare first results
dd($first, $chunk->first());
});

Не уверен, есть ли ошибка в Laravel или он предназначен для такой работы.

Я попытался найти, если у других была такая же проблема, был сделан только один билет, но он был закрыт в тот же день без каких-либо дополнительных подробностей.

может, мы можем попробовать вместо этого использовать курсоры? что лучше, чем разбиение на фрагменты для больших наборов данных.

Это будет по умолчанию в 3.2. Да.

В 3.1 вы можете вернуть курсор в метод сбора

так что эту ошибку нужно исправить в следующей версии, ты имеешь ввиду?

Да, в следующей версии должно работать из коробки

любая оценка, когда это будет?

Извините, у меня нет ETA для этого.

public function collection()
{
    return Request::query()->cursor()
}

^ Думаю, тебе этого уже должно хватить

Я не думаю, что это сработает с настройкой запроса, еще раз спасибо, если вы хотите, вы можете закрыть этот билет.

Он заменил бы метод query() который у вас есть прямо сейчас. Попробуй!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги