morphMany(Application::class, 'destination'); } public function postgresqls() { return $this->morphMany(StandalonePostgresql::class, 'destination'); } public function redis() { return $this->morphMany(StandaloneRedis::class, 'destination'); } public function keydbs() { return $this->morphMany(StandaloneKeydb::class, 'destination'); } public function dragonflies() { return $this->morphMany(StandaloneDragonfly::class, 'destination'); } public function clickhouses() { return $this->morphMany(StandaloneClickhouse::class, 'destination'); } public function mongodbs() { return $this->morphMany(StandaloneMongodb::class, 'destination'); } public function mysqls() { return $this->morphMany(StandaloneMysql::class, 'destination'); } public function mariadbs() { return $this->morphMany(StandaloneMariadb::class, 'destination'); } public function server() { return $this->belongsTo(Server::class); } /** * Get the server attribute using identity map caching. * This intercepts lazy-loading to use cached Server lookups. */ public function getServerAttribute(): ?Server { // Use eager loaded data if available if ($this->relationLoaded('server')) { return $this->getRelation('server'); } // Use identity map for lazy loading $server = Server::findCached($this->server_id); // Cache in relation for future access on this instance if ($server) { $this->setRelation('server', $server); } return $server; } public function services() { return $this->morphMany(Service::class, 'destination'); } public function databases() { $postgresqls = $this->postgresqls; $redis = $this->redis; $mongodbs = $this->mongodbs; $mysqls = $this->mysqls; $mariadbs = $this->mariadbs; $keydbs = $this->keydbs; $dragonflies = $this->dragonflies; $clickhouses = $this->clickhouses; return $postgresqls->concat($redis)->concat($mongodbs)->concat($mysqls)->concat($mariadbs)->concat($keydbs)->concat($dragonflies)->concat($clickhouses); } public function attachedTo() { return $this->applications?->count() > 0 || $this->databases()->count() > 0; } }