Filamentphp - Masalah handleRecordCreation $data tidak menerima value relationship

 Masalah ini munkin berlaku jika kita perlukan melakukan custom logic yang melibatkan relationship ketika proses CREATE.

<?php


/**
 * app\Filament\Resources\XXXResource.php
 * Repeater::make('bookingDetails') is relation of Booking hasMany bookingDetails
*/
public static function form(Form $form): Form
{
    return $form
        ->schema([
            Select::make('user_id')
            ->selectablePlaceholder(false)
            ->default(1)
            ->options(function () {
                return User::where('id', auth()->id())->get()->pluck('name', 'id');
            })
            ->required(),
        Select::make('ref_booking_category_id')
            ->label('Category')
            ->options(function () {
                return RefBookingCategory::where('id', '!=', RefBookingCategory::CART)->get()->pluck('name', 'id');
            })
            ->required(),
        TextInput::make('total_amount')
            ->default(0)
            ->required()
            ->maxLength(255),
        Select::make('ref_booking_status_id')
            ->default(1)
            ->selectablePlaceholder(false)
            ->options(function () {
                return RefBookingStatus::where('id', RefBookingStatus::COMPLETED)->get()->pluck('name', 'id');
            })
            ->required(),
        Textarea::make('desc')
            ->columnSpanFull(),
            Repeater::make('bookingDetails')
                    ->relationship()
                    ->schema([
                        Select::make('court_id')
                            ->options(fn ($state) => Court::all()->pluck('name', 'id')->toArray())
                            ->selectablePlaceholder(true)
                            ->multiple()
                            ->live(),
                        DateTimePicker::make('starts_at')
                            ->live(),
                        DateTimePicker::make('ends_at')
                            ->live(),
                        TextInput::make('amount')
                            ->default(0)
                            ->required()
                            ->maxLength(255),
                        Textarea::make('desc'),
                    ])
        ]);
}



/**
 * app\Filament\Resources\XXXResource\Pages\CreateXXX.php
 */
protected function handleRecordCreation(array $data): Model
{
    return dd($data);

    // 'bookingDetails' is missing in the array
    // [
    //     "user_id" => 1
    //     "ref_booking_category_id" => "2"
    //     "total_amount" => 0
    //     "ref_booking_status_id" => 1
    //     "desc" => null
    // ]
}

Jika kita lihat pada $data, tiada nilai bookingDetails. Sepatutnya $data memaparkan maklumat seperti dibawah

array:6 [ // app\Filament\Resources\BlockResource\Pages\CreateBlock.php:17
  "user_id" => 1
  "ref_booking_category_id" => "2"
  "total_amount" => 0
  "ref_booking_status_id" => 1
  "desc" => null
  "bookingDetails" => array:1 [
    0 => array:5 []
  ]
]

Bagi memaparkan data relationship, kita perlu memasukkan ->dehydrated() 

Repeater::make('bookingDetails')
    ->relationship()
    ->dehydrated()
    ->schema([
        Select::make('court_id')
            ->options(fn ($state) => Court::all()->pluck('name', 'id')->toArray())
            ->selectablePlaceholder(true)
            ->multiple()
            ->live(),
        DateTimePicker::make('starts_at')
            ->live(),
        DateTimePicker::make('ends_at')
            ->live(),
        TextInput::make('amount')
            ->default(0)
            ->required()
            ->maxLength(255),
        Textarea::make('desc'),
    ])


Post a Comment

Previous Post Next Post