Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Can traits be used for multi-tenancy in Laravel
    Laravel multi-tenancy traits global scope tenant ID Eloquent models PHP


Can traits be used for multi-tenancy in Laravel


Yes, traits can be very useful for implementing multi-tenancy in a Laravel application. Here's an example of how you can use a trait to handle multi-tenancy:

php
namespace App\Traits;

use Illuminate\Database\Eloquent\Builder;

trait MultiTenantable
{
    /**
     * Boot the trait.
     *
     * @return void
     */
    protected static function bootMultiTenantable()
    {
        // Attach the tenant scope to the model
        static::addGlobalScope('tenant', function (Builder $builder) {
            $builder->where('tenant_id', auth()->user()->tenant_id);
        });

        // Set the tenant ID when creating a new model
        static::creating(function ($model) {
            $model->tenant_id = auth()->user()->tenant_id;
        });
    }
}

In this example, the `MultiTenantable` trait does a few things:

1. It adds a global scope to the model that filters the records based on the current user's `tenant_id`.
2. It sets the `tenant_id` on the model when a new record is being created.

To use this trait, you would simply "use" it in your model:

php
namespace App\Models;

use App\Traits\MultiTenantable;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use MultiTenantable;

    // Model properties and methods
}

Now, whenever you interact with the `Post` model, the multi-tenancy logic will be automatically applied. This means that users will only see the records that belong to their tenant, and new records will be automatically associated with the user's tenant.

The beauty of using a trait for this is that you can easily apply the same multi-tenancy logic to any number of models in your application, without having to duplicate the code. This makes your codebase more maintainable and DRY (Don't Repeat Yourself).

Additionally, you can further customize the multi-tenancy behavior by overriding the methods in the trait or adding additional functionality as needed.

Citations:
[1] https://laraveldaily.com/post/simple-laravel-multi-tenancy-with-single-trait
[2] https://www.youtube.com/watch?v=iGE1tnDj7RU
[3] https://github.com/LaravelDaily/Laravel-Multi-Tenancy-Trait
[4] https://tenancyforlaravel.com
[5] https://dcblog.dev/enhancing-laravel-applications-with-traits-a-step-by-step-guide