From 9c9b2da6182d5ce98303cc0127946751d43f0d54 Mon Sep 17 00:00:00 2001 From: Ralfs Date: Mon, 12 Apr 2021 12:22:34 +0300 Subject: [PATCH] Instead of querying Domain model, find Tenant and eager load it's domain via Tenant model. Fixed cached lookup issue - when caching Tenant, also include the current Domain, so it can be later accessed via $tenant->domains->first() (even, when using multiple domains per tenant). Added tenantIdentifiedFromCache method in CachedTenantResolver.php, which can be used to set custom properties in resolvers after Tenant is loaded from cache. --- .../Contracts/CachedTenantResolver.php | 9 ++++++- src/Resolvers/DomainTenantResolver.php | 25 ++++++++++++++++--- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/Resolvers/Contracts/CachedTenantResolver.php b/src/Resolvers/Contracts/CachedTenantResolver.php index f25802aa..986f3832 100644 --- a/src/Resolvers/Contracts/CachedTenantResolver.php +++ b/src/Resolvers/Contracts/CachedTenantResolver.php @@ -37,7 +37,10 @@ abstract class CachedTenantResolver implements TenantResolver $key = $this->getCacheKey(...$args); if ($this->cache->has($key)) { - return $this->cache->get($key); + $tenant = $this->cache->get($key); + $this->tenantIdentifiedFromCache($tenant, ...$args); + + return $tenant; } $tenant = $this->resolveWithoutCache(...$args); @@ -64,6 +67,10 @@ abstract class CachedTenantResolver implements TenantResolver abstract public function resolveWithoutCache(...$args): Tenant; + public function tenantIdentifiedFromCache(Tenant $tenant, ...$args): void + { + } + /** * Get all the arg combinations for resolve() that can be used to find this tenant. * diff --git a/src/Resolvers/DomainTenantResolver.php b/src/Resolvers/DomainTenantResolver.php index 8e3857f3..6a3bcadb 100644 --- a/src/Resolvers/DomainTenantResolver.php +++ b/src/Resolvers/DomainTenantResolver.php @@ -28,18 +28,37 @@ class DomainTenantResolver extends Contracts\CachedTenantResolver public function resolveWithoutCache(...$args): Tenant { - /** @var Domain $domain */ - $domain = config('tenancy.domain_model')::where('domain', $args[0])->first(); + $domain = $args[0]; + + /** @var Tenant|null $tenant */ + $tenant = config('tenancy.tenant_model')::query() + ->whereHas('domains', function ($query) use ($domain) { + $query->select(['tenant_id', 'domain'])->where('domain', $domain); + }) + ->with([ + 'domains' => function ($query) use ($domain) { + $query->where('domain', $domain); + }, + ]) + ->first(); + + /** @var Domain|null $domain */ + $domain = $tenant?->domains->first(); if ($domain) { static::$currentDomain = $domain; - return $domain->tenant; + return $tenant; } throw new TenantCouldNotBeIdentifiedOnDomainException($args[0]); } + public function tenantIdentifiedFromCache(Tenant $tenant, ...$args): void + { + static::$currentDomain = $tenant->domains->first(); + } + public function getArgsForTenant(Tenant $tenant): array { $tenant->unsetRelation('domains');