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'),
])