WARNING *** PLEASE READ *** 17:00 Tenant middleware no longer goes inside the ->middleware() section. This will result in Filament::getTenant() returning null. Instead, now you need to use the ->tenantMiddleware() function. Here's the documentation link so you can read all about it: filamentphp.com/docs/3.x/panels/tenancy#using-tenant-aware-middleware-to-apply-global-scopes
I think so. The way I see it, the shield plugin works as a second layer. First, can the user access the tenant. Second, what can the user do inside the tenant (Shield). I haven't tested this myself but I see no reason why it shouldn't work
Is there a way to tap into whatever event is fired when a tenant is changed? I want to do something whenever a user changes the tenant, but can't find anything in the docs to see how to do it?
@@Tuto1902 Actually, there is. Every time a new tenant is set as "active" an Filament\Events\TenantSet is fired. You can register a listener to it and you're good to go.
that's very helpful, thank you, but I'm having problems inputting customer data, do I have to add team_id to the customer table, and what should the relationship be like? I don't really understand how it works
It all depends on what you’re trying to do. If your customers are going to belong to just one team, then yes. You need a team_id in the customers table and the relationship is One to Many (one team has many customers). But if the customer can have access to multiple teams, then you need a pivot table (customer_team) and the relationship is Many to Many
Hello Can you help me with this! I want to disable user to create new team! admin will create team for them! how can I achieve that kind of functionality ??
Have you tried adding a TeamPolicy with a create() method? laravel.com/docs/11.x/authorization#policy-methods Filament will enforce any policy automatically.
Create a ManyToMany relationship between Category and Team. Keep in mind that filament will try to look for a relationship called team() in the Category model. But since you want a ManyToMany relationship, I would suggest a relationship called teams() and then modify the owner relationship name in the CategoryResource class protected static ?string $tenantOwnershipRelationshipName = 'teams';
@@Tuto1902 Thank you very much for answering. So I edited the Resource and it worked for me. public static function getEloquentQuery(): Builder { $team_id= Auth::user()->teams->pluck('id'); return Category::whereIn('team_id', $team_id); }
Hi Tuto, thank you very much for this tutorial! I have a question, would you like to help me?. I'm facing this error: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'db_name.team_user' doesn't exist. How do i fix it?
Tuto, i've just found the solution: i only needed to create a pivot table named team_user, by executing "php artisan make:migration create_team_user_table"; then i put into the schema both $table->integer('user_id') and $table->integer('team_id'); then, finally, i run the migration.
That works, but this doesn't enforce the foreign keys in the database. I would recommend using $table->foreignIdFor(App\Models\User::class) and $table->foreignIdFor(App\Models\Team::class). This creates the appropriate indexes and makes the table more read efficient.
If the records Belong To a single team, yes. If the records can Belong To Many different teams, then you need a pivot table and probably adjust the owner relationship name in the resource class filamentphp.com/docs/3.x/panels/tenancy
I would just follow the docs. All queries made on resources should be scoped to the current tenant filamentphp.com/docs/3.x/panels/navigation#adding-a-badge-to-a-navigation-item As long as the model has the tenant relationships properly configured, everything should work as expected filamentphp.com/docs/3.x/panels/tenancy#configuring-the-tenant-relationships
Yeah, that works too. I forgot to mention that option. That way you don’t need to fiddle with the panel configuration and it will give you the same results
WARNING *** PLEASE READ ***
17:00 Tenant middleware no longer goes inside the ->middleware() section. This will result in Filament::getTenant() returning null. Instead, now you need to use the ->tenantMiddleware() function. Here's the documentation link so you can read all about it: filamentphp.com/docs/3.x/panels/tenancy#using-tenant-aware-middleware-to-apply-global-scopes
Thanks for share 🥇
No problem 👍
Thank you very much. You save my day. Can you show me the database?
Here's the entire code, including database migrations github.com/tuto1902/filament-multi-tenancy
can you make import excel, csv or another file for handling user in multi tenant ?
I’ll make a note for it. Thanks for the suggestion
Thank you😍
It is my absolute pleasure. I’m glad you find it helpful
Nice and clear tutorial! But is it possible to combine this with the Filament Shield plugin?
I think so. The way I see it, the shield plugin works as a second layer. First, can the user access the tenant. Second, what can the user do inside the tenant (Shield). I haven't tested this myself but I see no reason why it shouldn't work
Is there a way to tap into whatever event is fired when a tenant is changed? I want to do something whenever a user changes the tenant, but can't find anything in the docs to see how to do it?
I don't think there's a way to do that. At least none that I know of
@@Tuto1902 Actually, there is. Every time a new tenant is set as "active" an Filament\Events\TenantSet is fired. You can register a listener to it and you're good to go.
If the Jetstream Team, is similar to this? Thank you very much for valuable video❤❤❤
I appreciate you watching and I'm glad you find it helpful.
that's very helpful, thank you, but I'm having problems inputting customer data, do I have to add team_id to the customer table, and what should the relationship be like? I don't really understand how it works
It all depends on what you’re trying to do. If your customers are going to belong to just one team, then yes. You need a team_id in the customers table and the relationship is One to Many (one team has many customers). But if the customer can have access to multiple teams, then you need a pivot table (customer_team) and the relationship is Many to Many
okay tanks@@Tuto1902
Hello Can you help me with this! I want to disable user to create new team! admin will create team for them! how can I achieve that kind of functionality ??
Have you tried adding a TeamPolicy with a create() method?
laravel.com/docs/11.x/authorization#policy-methods
Filament will enforce any policy automatically.
What VS extensions are you using?
Catppuccin for VS Code, Catppuccin Icons and all the regular Intelephense extensions.
I have a model called category but I would like it to be shown in all the authenticated user's teams since they can have several teams?
Create a ManyToMany relationship between Category and Team. Keep in mind that filament will try to look for a relationship called team() in the Category model. But since you want a ManyToMany relationship, I would suggest a relationship called teams() and then modify the owner relationship name in the CategoryResource class
protected static ?string $tenantOwnershipRelationshipName = 'teams';
@@Tuto1902 Thank you very much for answering.
So I edited the Resource and it worked for me.
public static function getEloquentQuery(): Builder
{
$team_id= Auth::user()->teams->pluck('id');
return Category::whereIn('team_id', $team_id);
}
Hi Tuto, thank you very much for this tutorial! I have a question, would you like to help me?. I'm facing this error: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'db_name.team_user' doesn't exist. How do i fix it?
Tuto, i've just found the solution: i only needed to create a pivot table named team_user, by executing "php artisan make:migration create_team_user_table"; then i put into the schema both $table->integer('user_id') and $table->integer('team_id'); then, finally, i run the migration.
That works, but this doesn't enforce the foreign keys in the database. I would recommend using $table->foreignIdFor(App\Models\User::class) and $table->foreignIdFor(App\Models\Team::class). This creates the appropriate indexes and makes the table more read efficient.
No Github Repo because there are gaps especially in your DB
Probably, I wasn't focused on DB but more on quick tenancy setup. If you can elaborate on the gaps you found, I would love to hear your feedback
how solve nested relation ? All the tables need team_id record?
If the records Belong To a single team, yes. If the records can Belong To Many different teams, then you need a pivot table and probably adjust the owner relationship name in the resource class
filamentphp.com/docs/3.x/panels/tenancy
How can I set the navigation bage count for the current tenant
I would just follow the docs. All queries made on resources should be scoped to the current tenant
filamentphp.com/docs/3.x/panels/navigation#adding-a-badge-to-a-navigation-item
As long as the model has the tenant relationships properly configured, everything should work as expected
filamentphp.com/docs/3.x/panels/tenancy#configuring-the-tenant-relationships
How about global scope in model, can I still use it selected tenant instead of middlawere in resource?
Yeah, that works too. I forgot to mention that option. That way you don’t need to fiddle with the panel configuration and it will give you the same results
Did it work for you, it doesnt work for me
are this method support multi domains ?
Nope, this only covers single domain multi-tenancy.