Imagine you have a Filament form with Select and Input fields, where that second Input should be visible only if a particular Select item is chosen. In addition, the condition is defined in a DB column from that Select relationship table. How to do it?
Imagine a form for a Company where you need to fill in the name, the country and enter a VAT number only for the countries that require it.

Imagine this DB structure:
countries
- name
 - needs_vat (boolean, default 
false) 
companies
- name
 - country_id (foreign key)
 - vat_number (string, optional)
 
Filament form code where that VAT Number field is always visible:
app/Filament/Resources/CompanyResource.php:
public static function form(Form $form): Form{    return $form        ->schema([            Forms\Components\TextInput::make('name')                ->columnSpanFull(),            Forms\Components\Select::make('country_id')                ->relationship('country', 'name'),            Forms\Components\TextInput::make('vat_number'),        ]);}
According to the official Filament documentation, to show/hide a field, we need to use the ->live() method on the first field and can use the ->visible() method on the second field, with a callback function condition and $get() value.
Checkbox::make('is_company')    ->live() TextInput::make('company_name')    ->hidden(fn (Get $get): bool => ! $get('is_company'))
But our case is more complicated: how do we do that with a relationship column from the Select?
Our $get('country_id') would not return the needs_vat value.
One of the options is to query it from the database ourselves. Here's the updated working code:
app/Filament/Resources/CompanyResource.php:
public static function form(Form $form): Form{    return $form        ->schema([            Forms\Components\TextInput::make('name')                ->columnSpanFull(),            Forms\Components\Select::make('country_id')                ->relationship('country', 'name')                ->live(),             Forms\Components\TextInput::make('vat_number')                ->visible(                     fn($record, $get) => Country::query()                         ->where([                             'id' => $get('country_id'),                             'needs_vat' => 1                         ])->exists()                 ),          ]);}
If you want more Filament examples, you can find more real-life projects on our FilamentExamples.com.
                                                    
                                                    
                                                    
No comments or questions yet...