Laravel Filament を WSL2 docker sail laravel12 インストールと、1対Nサンプルアプリ、Filamentリレーションマネージャー
 
		  		        
      1対N(filament-relation-manager) サンプルアプリづくり
ubuntu起動
laravelインストール
curl -s https://laravel.build/filavel | bash
cd filavel
code . #VS CODE 起動
.env の編集
# DB_CONNECTION=mysql
# DB_HOST=mysql
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=sail
# DB_PASSWORD=password
DB_CONNECTION=sqlite
sail up -d

sail artisan migrate #エラー出る場合マイグレーション実行
filamentインストール
sail composer require filament/filament:"^3.2" -WfilamentのPanel Builderをインストール
sail artisan filament:install --panelsadmin、Yesと入力

Filament用管理ユーザ作成
sail artisan migrate
sail artisan make:filament-user
admin
admin@test.co.jp
password

サンプルモデル作成
sail artisan make:model -m Post
sail artisan make:model -m Tag
モデルのマイグレーション作成
database/migrations/yyyy_mm_dd_hhmmss_create_posts_table.php
    public function up(): void
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');	//追加
            $table->text('body');	    //追加
            $table->timestamps();
        });
    }
database/migrations/yyyy_mm_dd_hhmmss_create_tags_table.php
    public function up(): void
    {
        Schema::create('tags', function (Blueprint $table) {
            $table->id();
            $table->string('name')->unique();	//追加
            $table->timestamps();
        });
    }
モデルリレーションシップテーブル作成
sail artisan make:migration create_post_tag_table
database/migrations/yyyy_mm_dd_hhmmss_create_post_tag_table.php
    public function up(): void
    {
        Schema::create('post_tag', function (Blueprint $table) {
            $table->id();
            $table->unsignedInteger('post_id');
            $table->unsignedInteger('tag_id');
            $table->foreign('post_id')->references('id')->on('posts')->cascadeOnDelete();
            $table->foreign('tag_id')->references('id')->on('tags')->cascadeOnDelete();
            $table->unique(['post_id','tag_id']);
            $table->timestamps();
        });
    }
マイグレーション実行
sail artisan migrate

モデルの設定
app/Models/Post.php
class Post extends Model
{
    //
    use HasFactory;
    protected $fillable = ['title', 'body'];  //追加
    
    //下記も追加
    public function tags() 
    {
        return $this->belongsToMany(Tag::class);
    }
}
app/Models/Tag.php
class Tag extends Model
{
    //
    use HasFactory;
    protected $fillable = ['name'];  //追加
}
Filament用管理リソースを作成する
Filamentの管理画面でモデルのデータが扱えるようにリソースを作成します。
※参考)凄く楽する方法は、
https://github.com/askdkc/filamentphp_howto/blob/main/sub/easiest-way.md
リソース作成の基本を見たい人は、このまま手順を進めてください
sail artisan make:filament-resource Post
sail artisan make:filament-resource Tag
ファイルの編集
app/Filament/Resources/PostResource.php
public static function form(Form $form): Form
{
    return $form
        ->schema([
            // ここに編集したい項目を追加する
            Forms\Components\TextInput::make('title')->required()->label('タイトル')
                ->hint("ブログのタイトル入力"),
            Forms\Components\Textarea::make('body')->required()->label('本文')
                ->helperText('本文を入力します')
                ->columnSpan('full'),
        ]);
}
public static function table(Table $table): Table
{
    return $table
        ->columns([
            // ここに表示したい項目を追加する
            Tables\Columns\TextColumn::make('title')->label('タイトル'),
            Tables\Columns\TextColumn::make('body')->label('本文'),
        ])
        ->filters([
            //
        ])
        ->actions([
            Tables\Actions\EditAction::make(),
        ])
        ->bulkActions([
            Tables\Actions\BulkActionGroup::make([
                Tables\Actions\DeleteBulkAction::make(),
            ]),
        ]);
}app/Filament/Resources/TagResource.php
    public static function form(Form $form): Form
    {
        return $form
            ->schema([
                // ここに編集したい項目を追加する
                Forms\Components\TextInput::make('name')->required()->label('タグ')
                ->hint("タグ名を入力"),
            ]);
    }
    public static function table(Table $table): Table
    {
        return $table
            ->columns([
                // ここに表示したい項目を追加する
                Tables\Columns\TextColumn::make('name')->label('タグ'),
            ])
            ->filters([
                //
            ])
            ->actions([
                Tables\Actions\EditAction::make(),
            ])
            ->bulkActions([
                Tables\Actions\BulkActionGroup::make([
                    Tables\Actions\DeleteBulkAction::make(),
                ]),
            ]);
    }

postをクリックして下記のエラーが出たら

モデル Post.php、Tag.php に以下を追加
use Illuminate\Database\Eloquent\Factories\HasFactory;データがまだない状態。New postクリック

データを登録してみる



Filamentメニューの日本語化
.envの編集
APP_LOCALE=ja
APP_FALLBACK_LOCALE=ja
APP_FAKER_LOCALE=ja_JP
リロードすると、

Filamentリレーションマネージャーで1対N
Filamentリレーションリソースの追加
sail artisan make:filament-relation-manager PostResource tags name

PostモデルからTagの新規作成&割当を可能にするボタン追加
app/Filament/Resources/PostResource/RelationManagers/TagsRelationManager.php
    public function table(Table $table): Table
    {
        return $table
            ->recordTitleAttribute('name')
            ->columns([
                Tables\Columns\TextColumn::make('name'),
            ])
            ->filters([
                //
            ])
            ->headerActions([
                Tables\Actions\CreateAction::make(),
                Tables\Actions\AttachAction::make()->preloadRecordSelect()->label('タグ追加'), //追加
            ])
            ->actions([
                Tables\Actions\EditAction::make(),
                Tables\Actions\DeleteAction::make(),
            ])
            ->bulkActions([
                Tables\Actions\BulkActionGroup::make([
                    Tables\Actions\DeleteBulkAction::make(),
                ]),
            ]);
    }
PostResourceにTagとのリレーションシップを追加
app/Filament/Resources/PostResource.php
    public static function getRelations(): array
    {
        return [
            //
            PostResource\RelationManagers\TagsRelationManager::class, //追加
        ];
    }
Post画面でデータを編集モードで開くと、


そこで、Postの編集画面で「タグ追加」ボタンを押下すると、エラーとなる。

解決方法は、Tag.phpに、
class Tag extends Model
{
    //
    use HasFactory;
    protected $fillable = ['name'];  //追加
    //下記も追加
    public function posts() 
    {
        return $this->belongsToMany(Post::class);
    }
    
}
タグの選択画面も表示OK

注意)リレーションシップの付け替えについて
この画面の削除ボタンをクリックするとリレーションシップが外れるのではなく、sampleタグ自体が削除されてしまいます。

これを防ぐには TagsRelationManager.php を以下のように、Delete → Detach にする。
app/Filament/Resources/PostResource/RelationManagers/TagsRelationManager.php
    public function table(Table $table): Table
    {
        return $table
            ->recordTitleAttribute('name')
            ->columns([
                Tables\Columns\TextColumn::make('name'),
            ])
            ->filters([
                //
            ])
            ->headerActions([
                Tables\Actions\CreateAction::make(),
                Tables\Actions\AttachAction::make()->preloadRecordSelect()->label('タグ追加'), //追加
            ])
            ->actions([
                Tables\Actions\EditAction::make(),
                // Tables\Actions\DeleteAction::make(), //Delete コメント
                Tables\Actions\DetachAction::make(),  //Detach 追加
            ])
            ->bulkActions([
                Tables\Actions\BulkActionGroup::make([
                    Tables\Actions\DeleteBulkAction::make(),
                ]),
            ]);
    }
削除→解除に変わった。

参考
- 
            前の記事  Laravel Filament を WSL2 docker laravel12 インストール 2025.03.04
- 
            次の記事  windows docker WSL2 sail laravel filament phpadmin アプリ構築 メモ 2025.03.18