'datetime', 'updated_at' => 'datetime', 'deleted_at' => 'datetime', 'latitude' => 'float', 'longitude' => 'float', ]; /** * Ein Ort hat viele Events. */ public function events(): HasMany { return $this->hasMany(Event::class); } /** * Scope: Nach Name filtern (case-insensitive) */ public function scopeByName($query, $name) { return $query->where('name', 'like', '%' . $name . '%'); } /** * Scope: Nach Stadt filtern */ public function scopeByCity($query, $city) { return $query->where('city', 'like', '%' . $city . '%'); } /** * Boot-Methode: Auto-generate slug */ protected static function boot() { parent::boot(); static::creating(function ($location) { if (!$location->slug) { $location->slug = Str::slug($location->name); } }); static::updating(function ($location) { if (!$location->slug || $location->isDirty('name')) { $location->slug = Str::slug($location->name); } }); } /** * Getter: Vollständige Adresse */ public function getFullAddressAttribute(): string { $parts = []; // Straße und Hausnummer if ($this->street) { $parts[] = $this->street . ($this->house_number ? ' ' . $this->house_number : ''); } // PLZ und Stadt if ($this->postal_code || $this->city) { $parts[] = trim(($this->postal_code ?? '') . ' ' . ($this->city ?? '')); } // Bundesland (falls vorhanden) if ($this->state && $this->state !== $this->city) { $parts[] = $this->state; } // Land if ($this->country) { $parts[] = $this->country; } return implode(', ', array_filter($parts)); } /** * Getter: Kurze Adresse (Stadt/Ort) */ public function getShortAddressAttribute(): string { $parts = array_filter([ $this->postal_code, $this->city, ]); return implode(' ', $parts) ?: $this->name; } }