1
0
Fork 0
mirror of https://github.com/archtechx/tenancy.git synced 2026-08-06 06:54:03 +00:00

Fix duplicate entry error when updating TenantPivot columns (#1469)

`TriggerSyncingEvents` registered the pivot attach listener on `saved`,
which fires on both inserts and updates. So updating pivot columns on a
`TenantPivot` (e.g. via `updateExistingPivot()`) re-ran the attach flow
and tried to create the tenant resource again, causing a duplicate entry
error.

Switched the listener to `created` so we only attach when the pivot
record is first created (detaching already uses `deleting`, so using
`created` makes things a bit more consistent).

Added a regression test before the fix
(https://github.com/archtechx/tenancy/pull/1469/commits/5e3eb4322cc487d540796317e813ac2ffe076646).
The fix
(https://github.com/archtechx/tenancy/pull/1469/commits/d2fb4bc0d524cd98ec680e973b791f475afc3548)
then made the test pass.

Also improved the `saving` listener's comment a bit so that it's clear
where the "central resource not available" exception actually comes
from, since that wasn't obvious (also added the `@throws` annotation to
`getCentralResourceAndTenant()`).

Closes #1467
This commit is contained in:
lukinovec 2026-07-08 03:56:34 +02:00 committed by GitHub
parent 3156c87ee3
commit 869ad78454
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 35 additions and 4 deletions

View file

@ -274,6 +274,32 @@ test('attaching central resources to tenants or vice versa creates synced tenant
});
});
test('updating pivot column does not re-create the synced tenant resource', function () {
// Add an extra pivot column so we can update it
Schema::table('tenant_users', fn (Blueprint $table) => $table->string('note')->nullable());
$centralUser = CentralUser::create([
'global_id' => 'acme',
'name' => 'John Doe',
'email' => 'john@localhost',
'password' => 'secret',
'role' => 'commenter',
]);
$tenant = Tenant::create();
migrateUsersTableForTenants();
// Attaching creates the tenant resource
$centralUser->tenants()->attach($tenant);
$tenant->run(fn () => expect(TenantUser::count())->toBe(1));
// Updating a pivot column does not re-attach and create the resource again
// (which would throw a duplicate entry error -- regression test for #1467)
$centralUser->tenants()->updateExistingPivot($tenant->getTenantKey(), ['note' => 'foo']);
$tenant->run(fn () => expect(TenantUser::count())->toBe(1));
});
test('detaching central users from tenants or vice versa force deletes the synced tenant resource', function (bool $attachUserToTenant) {
$centralUser = CentralUser::create([
'global_id' => 'acme',