ブルーシュ

IT技術の勉強記録

ホーム > Laravel > Tips

【Filament v3】Relation Managerを設定して、関連するデータのテーブルを表示する方法

自分用メモシリーズ。
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

【Filament v3】Relation Managerを設定して、関連するデータのテーブルを表示する方法 #Tips #ウェブデザイン #ウェブ制作 #WEBデザイン #WEB制作 #Filament

作者の似顔絵

プログラミング歴19年🌈調べたことをブログにまとめていきます。
記事の感想・質問・間違い指摘などはツイッター ( @blooshcompany ) へお願いします。

秋田のウェブ活用をサポート

ホームページを自作してコスト削減!秋田の事業者は無料で利用できます。
ネットショップ・WordPress・SEO対策などさまざまなお悩みをサポートします。

その他、フロントエンド案件のご依頼はインフォメーション

秋田市 レンタル着物 笹パンダ堂のバナーリンク