windows docker WSL2 sail laravel filament phpadmin アプリ構築 メモ
 
		  		        
      アプリ構築メモ
前提
windows 11
docker desktop 4.12(ubuntu使用ON、WSL2使用ON)
WSL2 (ubuntu)
vs codelaravel インストール
curl -s https://laravel.build/sales | bash
cd sales
code .
.env 編集
APP_LOCALE=ja
APP_FALLBACK_LOCALE=ja
APP_FAKER_LOCALE=ja_JP
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=sales
DB_USERNAME=sales
DB_PASSWORD=passworddocker-compose.yml の編集
    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        links:
            - mysql:mysql
        ports:
            - 8080:80
        environment:
            MYSQL_USERNAME: '${DB_USERNAME}'
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            PMA_HOST: mysql
        networks:
            - sail起動
sail up -d
sail artisan migratehttp://localhost/
filamentインストール
sail composer require filament/filament:"^3.2" -W
filamentのPanel Builderをインストール
sail artisan filament:install --panelsadmin、Yesと入力

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

モデル作成
sail artisan make:model Dept -m
sail artisan make:model Emp -m
create table
yyyy_mm_dd_140749_create_depts_table.php
    public function up(): void
    {
        Schema::create('depts', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });
    }
yyyy_mm_dd_140755_create_emps_table.php
    public function up(): void
    {
        Schema::create('emps', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email');
            $table->date('date_of_birth');
            $table->foreignId('depts_id')->constrained('depts')->cascadeOnDelete();
            $table->timestamps();
        });
    }
sail artisan migrateモデル
Dept.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
class Dept extends Model
{
    //
    use HasFactory;
    protected $fillable = ['name'];  //追加
    public function emps(): HasMany
    {
        return $this->hasMany(Emp::class);
    }
}
Emp.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
class Emp extends Model
{
    //
    use HasFactory;
    protected $fillable = ['name' ,'email', 'date_of_birth', 'depts_id'];  //追加
    public function depts(): BelongsTo
    {
        return $this->belongsTo(Dept::class);
    }
}
filament用管理リソースを作成
sail artisan make:filament-resource Dept
sail artisan make:filament-resource Emp
DeptResource.php
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\DeptResource\Pages;
use App\Filament\Resources\DeptResource\RelationManagers;
use App\Models\Dept;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
class DeptResource extends Resource
{
    protected static ?string $model = Dept::class;
    protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
    public static function form(Form $form): Form
    {
        return $form
            ->schema([
                //
                Forms\Components\TextInput::make('name')
                    ->required()        // 入力必須
                    ->maxLength(255),   // 最長255文字
            ]);
    }
    public static function table(Table $table): Table
    {
        return $table
            ->columns([
                //
                Tables\Columns\TextColumn::make('name')
                    ->sortable()
                    ->searchable(),
            ])
            ->filters([
                //
            ])
            ->actions([
                Tables\Actions\EditAction::make(),
            ])
            ->bulkActions([
                Tables\Actions\BulkActionGroup::make([
                    Tables\Actions\DeleteBulkAction::make(),
                ]),
            ]);
    }
    public static function getRelations(): array
    {
        return [
            //
        ];
    }
    public static function getPages(): array
    {
        return [
            'index' => Pages\ListDepts::route('/'),
            'create' => Pages\CreateDept::route('/create'),
            'edit' => Pages\EditDept::route('/{record}/edit'),
        ];
    }
}
EmpResource.php
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\EmpResource\Pages;
use App\Filament\Resources\EmpResource\RelationManagers;
use App\Models\Emp;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
class EmpResource extends Resource
{
    protected static ?string $model = Emp::class;
    protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
    public static function form(Form $form): Form
    {
        return $form
            ->schema([
                //
                Forms\Components\TextInput::make('name')
                    ->required()        // 入力必須
                    ->maxLength(255),   // 最長255文字
                Forms\Components\TextInput::make('email')
                    ->required()        // 入力必須
                    ->maxLength(255),   // 最長255文字
                // 日付ピッカー
                Forms\Components\DatePicker::make('date_of_birth')
                    ->required()        // 入力必須
                    ->maxDate(now()),   // 最大日付:現在
                Forms\Components\Select::make('depts_id')
                    // モデル:Patient::owner() / ラベル:name
                    ->relationship('depts', 'name')
                    ->searchable()  // 検索対象に設定
                    ->preload()     // 事前に取得50件
            ]);
    }
    public static function table(Table $table): Table
    {
        return $table
            ->columns([
                //
                Tables\Columns\TextColumn::make('name')
                    ->sortable()
                    ->searchable(),
                Tables\Columns\TextColumn::make('email')
                    ->sortable()
                    ->searchable(),
                Tables\Columns\TextColumn::make('date_of_birth')
                    ->sortable()
                    ->sortable(),
                Tables\Columns\TextColumn::make('depts.name')
                    ->sortable()
                    ->searchable(),
            ])
            ->filters([
                //
            ])
            ->actions([
                Tables\Actions\EditAction::make(),
            ])
            ->bulkActions([
                Tables\Actions\BulkActionGroup::make([
                    Tables\Actions\DeleteBulkAction::make(),
                ]),
            ]);
    }
    public static function getRelations(): array
    {
        return [
            //
        ];
    }
    public static function getPages(): array
    {
        return [
            'index' => Pages\ListEmps::route('/'),
            'create' => Pages\CreateEmp::route('/create'),
            'edit' => Pages\EditEmp::route('/{record}/edit'),
        ];
    }
}





参考)
- 
            前の記事  Laravel Filament を WSL2 docker sail laravel12 インストールと、1対Nサンプルアプリ、Filamentリレーションマネージャー 2025.03.17
- 
            次の記事  Laravel Filament 3 インストール、基本、1対N、N対N 学習メモ 2025.03.20