Filament: Usar diferentes recursos para una misma tabla
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 :-)