自分用メモシリーズ。
LaravelとFilamentはまだ勉強中なので、「とりあえず動く」を目標にやっています。
自分用メモシリーズの記事は参考程度にしてください。
Filamentのバージョンは3.xです。
公式の解説に沿って説明します。
Getting started - Panel Builder - Filament
Relation Managerとは?
まずは、モデルを作成します。公式の解説では、動物病院のシステム構築を想定しています。Owner(飼い主)、Patient(患者ペット)、Treatment(施術)というモデルを作成します。
php artisan make:model Owner -m
php artisan make:model Patient -m
php artisan make:model Treatment -m
これをSSHでコマンド入力すると、database/migrations/に3つのファイルが作成されます。
Defining migrationsを参考に編集します。解説ページではあたかも1つのファイルにまとまっているかのように見えますが、それぞれ別のファイルです。
ここでデータベースにどのようなカラムを作成するかを設定します。
すると、1人の飼い主に対して複数のペットを登録したいし、ペットもまた、複数の施術を登録したくなります。
それを管理するのがRelation Managerです。
そういうわけで、Setting up relationships between modelsのとおりにモデルクラスを編集します。
解説ページではあたかも1つのファイルにまとまっているかのように見えますが、それぞれ別のファイルです。
app/Models/Owner.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
class Owner extends Model
{
public function patients(): HasMany
{
return $this->hasMany(Patient::class);
}
}
app/Models/Patient.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
class Patient extends Model
{
public function owner(): BelongsTo
{
return $this->belongsTo(Owner::class);
}
public function treatments(): HasMany
{
return $this->hasMany(Treatment::class);
}
}
app/Models/Treatment.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Treatment extends Model
{
public function patient(): BelongsTo
{
return $this->belongsTo(Patient::class);
}
}
リソースを作成する
次は、Introducing resourcesに沿ってリソースを作成してください。
php artisan make:filament-resource Patient
app/Filament/Resources/PatientResource.phpのほか、さまざまなファイルが作成されます。
ここまでくると、管理画面に「Patient」という項目が見えるようになります。
PatientResource.phpの$tableの内容が、管理画面のPatient > 一覧ページに見えることになり、$formの内容が、管理画面のPatient > 編集のページに見えることになります。
Relation Managerを作成する
さっき、Relation Managerを設定したような気がしますが、またSSHでコマンドを入力します。
php artisan make:filament-relation-manager PatientResource treatments description
Patientの編集ページに、これまで受けた施術が表示されることになります。表示内容はdescriptionですが、あとで編集可能です。
コマンド入力すると、PatientResource/RelationManagers/TreatmentsRelationManager.phpというファイルが作成されます。
次に、app/Filament/Resources/PatientResource.phpを編集します。
ファイルの上のほうに
use App\Filament\Resources\PatientResource\RelationManagers;
を追加します。
また、ファイルの中のほうに下記の内容を追加します。
public static function getRelations(): array
{
return [
RelationManagers\TreatmentsRelationManager::class,
];
}
すでに空欄のgetRelations()が存在する場合もあります。
これで、ペットの編集/詳細ページに施術一覧が表示されるようになります。
こちらのページも参考にご覧ください。
Managing relationships - Panel Builder - Filament