Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Multitenancy Laravel Package

spatie/laravel-multitenancy

Unopinionated multitenancy for Laravel. Detect the current tenant per request and define what happens when switching tenants. Supports single or multiple databases, tenant-aware queued jobs, commands that run per tenant, and easy per-model connection setup.

View on GitHub
Deep Wiki
Context7

title: Making Artisan command tenant aware weight: 3

Commands can be made tenant aware by applying the TenantAware trait. When using the trait it is required to append {--tenant=*} or {--tenant=} to the command signature.

Caution: If you append {--tenant=*}, then if no tenant option is provided when executing the command, the command will execute for all tenants.

use Illuminate\Console\Command;
use Spatie\Multitenancy\Commands\Concerns\TenantAware;

class YourFavoriteCommand extends Command
{
    use TenantAware;

    protected $signature = 'your-favorite-command {--tenant=*}';

    public function handle()
    {
        return $this->line('The tenant is '. Tenant::current()->name);
    }
}

When executing the command, the handle method will be called for each tenant.

php artisan your-favorite-command

Using the example above, the name of each tenant will be written to the output of the command.

You can also execute the command for a specific tenant:

php artisan your-favorite-command --tenant=1

Using the tenants:artisan command

If you cannot change an Artisan command yourself, for instance a command from Laravel itself or a command from a package, you can use tenants:artisan <artisan command>. This command will loop over tenants and for each of them make that tenant current, and execute the artisan command.

When your tenants each have their own database, you could migrate each tenant database with this command (given you are using a task like SwitchTenantDatabase):

php artisan tenants:artisan migrate

We are using the migrate command here, but you can pass any command that you like.

Passing arguments and options

If you use quotes around the command part you can use any argument and option that the command supports.

php artisan tenants:artisan "migrate --seed"

Running artisan command for specific tenants

If the command only needs to run for a specific tenant, you can pass its id to the tenant option.

php artisan tenants:artisan "migrate --seed" --tenant=123

State Persistence

When using TenantAware, the same command instance is executed for each tenant. This means that instance properties will retain their values between tenant executions unless explicitly reset.

use Illuminate\Console\Command;
use Spatie\Multitenancy\Commands\Concerns\TenantAware;

class YourFavoriteCommand extends Command
{
use TenantAware;

    protected $signature = 'your-favorite-command {--tenant=*}';

    protected int $counter = 0;

    public function handle()
    {
        // Reset state at the beginning of each tenant execution
        $this->counter = 0;

        // Without the reset above, $counter would start at the value 
        // from the previous tenant's execution
        $this->incrementCounter();

        return $this->line('Counter: '. $this->counter);
    }

    public function incrementCounter()
    {
        $this->counter++;
    }
}
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
davejamesmiller/laravel-breadcrumbs
artisanry/parsedown
christhompsontldr/phpsdk
enqueue/dsn
bunny/bunny
enqueue/test
enqueue/null
enqueue/amqp-tools
milesj/emojibase
bower-asset/punycode
bower-asset/inputmask
bower-asset/jquery
bower-asset/yii2-pjax
laravel/nova
spatie/laravel-mailcoach
spatie/laravel-superseeder
laravel/liferaft
nst/json-test-suite
danielmiessler/sec-lists
jackalope/jackalope-transport