filament-excel icon indicating copy to clipboard operation
filament-excel copied to clipboard

Error when exporting using queue, auth user and filter with relation

Open ArnaudBan opened this issue 2 years ago • 7 comments

I have create the smallest test project to reproduce the bug : https://github.com/ArnaudBan/filament-excel-export-reproduce-bug

There is a bug when :

  1. you set the export to use fromTable() and ->queue()
ExcelExport::make('table')
   ->fromTable()
    ->queue()
  1. In the filament ressource you have a query that depends on the auht()->user
public static function getEloquentQuery(): Builder
{
    return parent::getEloquentQuery()
       ->where('city_id', auth()->user()->city_id);
}
  1. You have a filter with a relation field
->filters([
    Tables\Filters\SelectFilter::make('place')
        ->relationship('city', 'name')
])

Then when you export you have an error because the export try to get the query of the filament resource, but when it is done asynchronously there is no auth user

ErrorException: Attempt to read property "city_id" on null in /Users/arnaudbanvillet/Sites/export-bug/app/Filament/Resources/UserResource.php:27

ArnaudBan avatar Aug 03 '23 07:08 ArnaudBan

Thanks for creating an issue and providing a reproduction repo. I am not really sure how to tackle this though, since currently we just serialize the closures and of course the user gets lost on the queue. Need to think of some workarounds.

I probably won't have time to look into this in the next weeks as I still have some client work and still haven't upgraded my plugins for Filament v3 which is a priority for me.

pxlrbt avatar Aug 03 '23 08:08 pxlrbt

I have similar issues when using Auth::user() in a closure of a filter method (e.g. visible()), even without using ->fromTable().

Another related issue is global scopes using Auth::user(). As a workaround I use the ->modifyQueryUsing(...) method on the ExcelExport::make() method, to force my global scope.

Did you find any solution ?

MichaelMdp avatar Aug 28 '23 14:08 MichaelMdp

No, sorry. Didn't have the time to look into this and it wasn't my priority so far, since there were other bugs. When I think about it: A possible solution would be to store the current user with the job and authenticate as that user before running the queue.

But I think I need to overwrite the Job classes from the excel package. Sounds like it would take quite some time.

pxlrbt avatar Aug 28 '23 14:08 pxlrbt

Anybody know any work-around with this one? Seems like I have to remove queue() method till this bug gets resolved.

nitinatvaluelabs avatar Feb 16 '24 07:02 nitinatvaluelabs

@nitinatvaluelabs try official Export Action added in FilamentPhp V3

https://filamentphp.com/docs/3.x/actions/prebuilt-actions/export

sadekd avatar Feb 16 '24 07:02 sadekd

@sadekd Does the official one support columns based on the logged in user? I think this is more of a new feature than a bug.

pxlrbt avatar Feb 16 '24 10:02 pxlrbt

@sadekd Unfortunately, I am stuck with version 2 for the next two months. :(

nitinatvaluelabs avatar Feb 16 '24 18:02 nitinatvaluelabs