Filament: Usar diferentes recursos para una misma tabla
Cómo dividir la gestión de una tabla en diferentes recursos en Filament.
Esta es una situación con la que me he encontrado algunas veces. Os pongo un ejemplo real:
Tenemos una tabla properties
, que refiere a propiedades inmobiliarias. Esta tabla tiene una columna type
, que indica si la propiedad inmobiliaria es un proyecto (aún no está construida) o si ha sido scrapeada de alguna plataforma (valor auto). Necesitamos dos pantallitas en el panel de administración de Filament:
- Una para ver (no editar ni eliminar) las propiedades scrapeadas
- Otra para gestionar los proyectos
Hacer esto es, de hecho, bastante sencillo. Vamos al ejemplo de proyectos. Primero creamos el recurso de Filament:
php artisan make:filament-resource Project
Una vez creado, nos vamos al fichero app/Filament/Resources/ProjectResource.php
. Tendremos algo así:
class ProjectResource extends Resource
{
protected static ?string $model = Project::class;
protected static ?string $navigationIcon = 'heroicon-o-home';
// ...
}
La principal clave está en esa propiedad $model
. Esto le indica a Filament cuál es el modelo de Eloquent que tiene que utilizar. Como en este caso no estamos usando la convención (ProjectResource <=> Project), lo podemos cambiar a nuestro modelo Property
:
class ProjectResource extends Resource
{
protected static ?string $model = Property::class;
protected static ?string $navigationIcon = 'heroicon-o-home';
// ...
}
Una vez el modelo está cambiado, si recargamos la página en Filament veremos que ya nos carga correctamente los registros de la tabla properties
. Sin embargo, aún nos falta filtrar para que solamente coja los registros del tipo project
.
Para ello, podemos sobrescribir el método getEloquentQuery()
del recurso de Filament:
use Illuminate\Database\Eloquent\Builder;
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()
->where('type', 'project');
}
Y listo! Ahora nuestro recurso Projects mostrará y servirá para gestionar las propiedades de tipo project :-)