*/ protected $fillable = [ 'id', 'name', ]; /** * Define the custom columns (that won't be stored in the data JSON column) * by overriding the getCustomColumns() method. * * @see https://tenancyforlaravel.com/docs/v3/tenants * * @return array */ public static function getCustomColumns(): array { return [ 'id', 'name', ]; } /** * Perform any actions required after the model boots. * * @return void */ protected static function booted(): void { static::creating(function (self $model) { // * ASSERTIONS self::assertNameIsUnique($model->name); // * TRANSFORMATIONS $model->id = Str::slug($model->name); }); static::created(function () { self::resetCache(); }); static::updating(function (self $model) { // * ASSERTIONS self::assertNameIsUnique($model->name, $model->id); // * TRANSFORMATIONS $model->id = Str::slug($model->name); }); static::updated(function () { self::resetCache(); }); static::deleted(function (self $model) { self::resetCache(); dispatch(new SendTenantDeletedMail($model->name)); }); } // * METHODS /** * Reset all cache elements related to a given tenant id. * * @return void */ private static function resetCache(): void { Cache::forget('all_tenants'); self::getFromCache(); } /** * Get from cache a Setting model with a key like this : {tenant}_settings and for remember it 24 hours. * * @return \Illuminate\Database\Eloquent\Collection */ public static function getFromCache(): \Illuminate\Database\Eloquent\Collection { return Cache::remember( 'all_tenants', 86400, function () { return self::query()->get(); }, ); } /** * Asserts using validation that the name is unique * * @param string|null $name * @param string|null $id * @return void * @throws \Illuminate\Validation\ValidationException If name already exists. */ private static function assertNameIsUnique(string|null $name, ?string $id = null) { $table = (new self())->getTable(); ToolboxHelper::assertFieldIsUnique($table, 'name', $name, $id); ToolboxHelper::assertFieldIsUnique($table, 'id', Str::slug($name), $id); } // * RELATIONSHIPS /** * The tenants that belong to the user. * * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany */ public function users(): BelongsToMany { return $this->belongsToMany(User::class); } /** * The settings associated to the tenant. * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function settings(): HasMany { return $this->hasMany(Settings::class); } /** * The fonts associated to the tenant. * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function fonts(): HasMany { return $this->hasMany(Font::class); } /** * The brands associated to the tenant. * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function brands(): HasMany { return $this->hasMany(Brand::class); } /** * The brands associated to the tenant. * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function products(): HasMany { return $this->hasMany(Product::class); } /** * The brands associated to the tenant. * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function ranges(): HasMany { return $this->hasMany(Range::class); } /** * The activity logs associated to the tenant. * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function activityLogs(): HasMany { return $this->hasMany(ActivityLog::class); } }