Skip to main content
Tutorial Free

Filament: Hide Relation Manager by Condition

April 25, 2024
3 min read

In Filament, sometimes you need to show/hide elements based on a condition, like user's role. In this tutorial, we will see how to hide/disable Filament Relation Manager if the record doesn't belong to the logged-in user.

This apartment does not belong to us, so how can we hide the Filament Relation Manager?


Project

In our project, we have two connected Resources:

  • Apartments - Where people put their apartment information (in our case, this is listing information)
  • Apartment Documents - A relation manager where we should be able to upload private documents without showing the relation manager to unauthorized users.

This is how it looks right now:

app/Filament/Resources/ApartmentResource.php

// ...
 
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\Select::make('user_id')
->relationship('user', 'name')
->required(),
Forms\Components\TextInput::make('name')
->required(),
Forms\Components\Textarea::make('description')
->required()
->columnSpanFull(),
Forms\Components\TextInput::make('price')
->required()
->numeric()
->prefix('$'),
Forms\Components\TextInput::make('bedrooms')
->required()
->numeric(),
]);
}
 
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('user.name')
->numeric()
->sortable(),
Tables\Columns\TextColumn::make('name')
->searchable(),
Tables\Columns\TextColumn::make('price')
->money()
->sortable(),
Tables\Columns\TextColumn::make('bedrooms')
->numeric()
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
//
])
->actions([
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
 
public static function getRelations(): array
{
return [
RelationManagers\ApartmentDocumentsRelationManager::class
];
}
 
// ...

And our ApartmentDocumentsRelationManager looks like this:

app/Filament/Resources/ApartmentResource/RelationManagers/ApartmentDocumentsRelationManager.php

// ...
 
protected static string $relationship = 'apartmentDocuments';
 
public function form(Form $form): Form
{
return $form
->schema([
Forms\Components\FileUpload::make('file')
->required(),
Forms\Components\TextInput::make('description')
->required()
->maxLength(255),
]);
}
 
public function table(Table $table): Table
{
return $table
->recordTitleAttribute('description')
->columns([
Tables\Columns\TextColumn::make('file'),
Tables\Columns\TextColumn::make('description'),
])
->filters([
//
])
->headerActions([
Tables\Actions\CreateAction::make(),
])
->actions([
Tables\Actions\EditAction::make(),
Tables\Actions\DeleteAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
 
// ...

While this is a simple example, we still want to hide the Relation Manager! So let's do that next.


Hiding the Relation Manager

To hide the Relation manager - we can use the function canViewForRecord():

app/Filament/Resources/ApartmentResource/RelationManagers/ApartmentDocumentsRelationManager.php

use Illuminate\Database\Eloquent\Model;
 
// ...
 
public static function canViewForRecord(Model $ownerRecord, string $pageClass): bool
{
return $ownerRecord->user_id === auth()->id();
}

If we reload the page, we will see that the Relation Manager is hidden!

If we open the apartment assigned to our user, we will see the Relation Manager:

That's it! You have successfully hidden the Relation Manager based on a condition. While this was a simple example, here are the key points:

  • The canViewForRecord() method controls whether the User can see the Relation Manager.
  • $ownerRecord will give us the owner Record (in our case, this was the Apartment).
  • You can add any condition to the canViewForRecord() method if it returns a boolean.

Enjoyed This Tutorial?

Get access to all premium tutorials, video and text courses, and exclusive Laravel resources. Join our community of 10,000+ developers.

Comments & Discussion

No comments yet…

We'd Love Your Feedback

Tell us what you like or what we can improve

Feel free to share anything you like or dislike about this page or the platform in general.