
Gestire le relazioni in FilamentPHP
By
Se abbiamo delle entità che hanno relazioni uno-a-molti o molti-a-molti con un’altra entità, possiamo sfruttare un potente sistema di gestione delle relazioni offerto da Filament per visualizzare e poter accedere alle risorse collegate a partire dalla risorsa primaria. Vediamo nel concreto cosa significa e come si fa.
Le varie entità in gioco
Mettiamo di avere il model Post che ha come risorsa Filament “Posts”, poi abbiamo il model Category con risorsa “Categories” e la relazione di Post su Category è di tipo uno a molti. Vedi questo articolo per approfondire le resources Filament.
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use App\Models\Category;
class Post extends Model
{
protected $fillable = [
'slug',
'title',
'content',
];
public function categories()
{
return $this->belongsToMany(Category::class)->using(PostCategory::class);
}
}Avremo quindi bisogno di una terza entità (e classe) pivot PostCategory che viene usata per associare le categorie assegnate ad ogni post. Quindi per ricapitolare avremo 2 entità principali da mettere in relazione tramite una tabella pivot.
Relazioni in Filament
Per creare la relazione eseguiamo:
php artisan make:filament-relation-manager PostResource categories
La regola è questa:
- PostResource è il nome della classe della resource primaria, cioè a cui si vuole imputare la seconda entità
- categories è il nome della relazione
Vengono fatte alcune domande come se l’entità fa parte di un cluster (vedi questo articolo), se vogliamo collegare questa entità ad una già esistente, ecc.
Poi dobbiamo necessariamente aggiungere nel file principale della risorsa Filament dei Post (PostResource.php), nel metodo dedicato alle relazioni (getRelations) la relazione appena creata:
public static function getRelations(): array
{
return [
RelationManagers\CategoriesRelationManager::class,
];
}Una volta fatto questo vedremo nel form di un Post (nuovo o in modalità edit) il tab relativo alla relazione appena creata.