Cuando trabajamos con Filament y tenemos modelos que deben estar limitados por el scope de una empresa, asignar correctamente el company_id en los registros puede convertirse en un reto, especialmente al manejar importaciones masivas. En este artículo, compartiré mi experiencia y solución para este problema.
En mi sistema, manejo dos modelos principales:
Aunque no utilizo el sistema de multi-tenancy de Filament, todas mis consultas están limitadas por un scope para que cada usuario solo pueda ver los registros de su empresa.
Inicialmente, intenté asignar el company_id al trabajador en el WorkerObserver. Para ello, obtenía el ID de la empresa del usuario autenticado con auth()->user()->company_id y lo asignaba en el evento creating.
Sin embargo, al realizar importaciones, el proceso se ejecuta dentro de un Job, lo que impide acceder directamente a auth()->user(). Intenté usar lifehooks y la propiedad $import->user() dentro de la importación, pero no logré que funcionara correctamente.
Para resolver este problema, opté por modificar la acción de importación en WorkerResource, agregando una opción personalizada para pasar el company_id del usuario autenticado:
->headerActions([ ImportAction::make() ->importer(WorkerImporter::class) ->options(['companyId' => auth()->user()->company_id]) ->maxRows(10000) ])
Luego, dentro del importador WorkerImporter, utilicé el lifehook beforeFill() para asignar el company_id si aún no estaba definido:
protected function beforeFill(): void { if (!isset($this->data['company_id'])) { $this->data['company_id'] = $this->options['companyId']; } }
Por último, en mi WorkerObserver, aseguré que cualquier creación manual de registros también asigne el company_id correctamente:
public function creating(Worker $worker): void { if (is_null($worker->company_id)) { $worker->company_id = auth()->user()->company_id ?? null; } }
Esto me permitió manejar tanto importaciones como inserciones manuales o mediante seeders locales sin problemas.
Si estás enfrentando problemas similares con importaciones en Filament, esta estrategia puede ayudarte a asegurarte de que los registros se asignen correctamente a la empresa del usuario.
Page loaded in 23.24 ms