mirror of
https://github.com/archtechx/tenancy.git
synced 2025-12-14 01:44:03 +00:00
Simplify DeleteAllTenantMappings (code and docblocks)
This commit is contained in:
parent
cb91083024
commit
9c16b7d53e
2 changed files with 16 additions and 36 deletions
|
|
@ -10,56 +10,36 @@ use Stancl\Tenancy\Events\TenantDeleted;
|
||||||
use Stancl\Tenancy\Listeners\QueueableListener;
|
use Stancl\Tenancy\Listeners\QueueableListener;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When a tenant is deleted, clean up pivot records related to that tenant.
|
* When a tenant is deleted, clean up pivot records related to that tenant
|
||||||
* Only use this listener for cleaning up tables without tenant foreign key constraints.
|
* in the pivot tables specified in the $pivotTables property (see the property for details).
|
||||||
*
|
*
|
||||||
* If you're using foreign key constraints on the tenant key columns in your pivot tables,
|
* Only use this listener for cleaning up tables without tenant foreign key constraints.
|
||||||
* you still must include ->onDelete('cascade') in the constraint definition
|
* When using foreign key constraints, you'll have to use ->onDelete('cascade')
|
||||||
* for the pivot records to be deleted automatically. Without ->onDelete('cascade'),
|
* on the constraint definition for the cleanup instead of utilizing this listener because
|
||||||
* the constraint will prevent tenant deletion before this listener can clean up the pivot records,
|
* the constraint will prevent tenant deletion before this listener can clean up the pivot records,
|
||||||
* causing an integrity constraint violation.
|
* causing an integrity constraint violation.
|
||||||
*
|
|
||||||
* With ->onDelete('cascade'), the database will handle the cleanup automatically,
|
|
||||||
* so there's no need to use this listener (it won't break anything, but it's redundant).
|
|
||||||
*
|
|
||||||
* By default, this listener only cleans up the 'tenant_resources' polymorphic pivot table,
|
|
||||||
* and the records to delete are found by the 'tenant_id' column.
|
|
||||||
*
|
|
||||||
* To customize which pivot tables to clean up (or which column has the tenant key),
|
|
||||||
* set DeleteAllTenantMappings::$pivotTables to an array of table names as the keys,
|
|
||||||
* and their values should be tenant key column names (e.g. 'tenant_id').
|
|
||||||
*
|
|
||||||
* For example (e.g. in TenancyServiceProvider):
|
|
||||||
* DeleteAllTenantMappings::$pivotTables = [
|
|
||||||
* 'tenant_users' => 'tenant_id',
|
|
||||||
* ];
|
|
||||||
*
|
|
||||||
* Tables that do not exist will be skipped.
|
|
||||||
*/
|
*/
|
||||||
class DeleteAllTenantMappings extends QueueableListener
|
class DeleteAllTenantMappings extends QueueableListener
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Pivot tables to clean up after a tenant is deleted,
|
* Pivot tables to clean up after a tenant is deleted,
|
||||||
* formatted like ['table_name' => 'tenant_key_column'].
|
* formatted like ['table_name' => 'tenant_key_column'].
|
||||||
* E.g. ['tenant_users' => 'tenant_id'].
|
|
||||||
*
|
*
|
||||||
* If empty, the listener defaults to cleaning only
|
* By default, the listener only cleans up the default pivot
|
||||||
* the default pivot ('tenant_resources' with 'tenant_id' as the tenant key column).
|
* ('tenant_resources' with 'tenant_id' as the tenant key column).
|
||||||
*
|
*
|
||||||
* Set this property, e.g. in your TenancyServiceProvider,
|
* To customize this, set this property, e.g. in TenancyServiceProvider:
|
||||||
* for this listener to clean up specific pivot tables.
|
* DeleteAllTenantMappings::$pivotTables = [
|
||||||
|
* 'tenant_users' => 'tenant_id',
|
||||||
|
* ];
|
||||||
|
*
|
||||||
|
* Non-existent tables specified in the property will be skipped.
|
||||||
*/
|
*/
|
||||||
public static array $pivotTables = [];
|
public static array $pivotTables = ['tenant_resources' => 'tenant_id'];
|
||||||
|
|
||||||
public function handle(TenantDeleted $event): void
|
public function handle(TenantDeleted $event): void
|
||||||
{
|
{
|
||||||
$pivotTables = static::$pivotTables;
|
foreach (static::$pivotTables as $table => $tenantKeyColumn) {
|
||||||
|
|
||||||
if (! $pivotTables) {
|
|
||||||
$pivotTables = ['tenant_resources' => 'tenant_id'];
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($pivotTables as $table => $tenantKeyColumn) {
|
|
||||||
if (Schema::hasTable($table)) {
|
if (Schema::hasTable($table)) {
|
||||||
DB::table($table)->where($tenantKeyColumn, $event->tenant->getTenantKey())->delete();
|
DB::table($table)->where($tenantKeyColumn, $event->tenant->getTenantKey())->delete();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,7 @@ beforeEach(function () {
|
||||||
CreateTenantResource::$shouldQueue = false;
|
CreateTenantResource::$shouldQueue = false;
|
||||||
DeleteResourceInTenant::$shouldQueue = false;
|
DeleteResourceInTenant::$shouldQueue = false;
|
||||||
UpdateOrCreateSyncedResource::$scopeGetModelQuery = null;
|
UpdateOrCreateSyncedResource::$scopeGetModelQuery = null;
|
||||||
DeleteAllTenantMappings::$pivotTables = [];
|
DeleteAllTenantMappings::$pivotTables = ['tenant_resources' => 'tenant_id'];
|
||||||
|
|
||||||
// Reset global scopes on models (should happen automatically but to make this more explicit)
|
// Reset global scopes on models (should happen automatically but to make this more explicit)
|
||||||
Model::clearBootedModels();
|
Model::clearBootedModels();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue