name($name); } public static function make(string $name): static { $static = app(static::class, ['name' => $name]); $static->configure(); return $static; } public function name(string $name): static { $this->name = $name; return $this; } public function label(string | Closure | null $label): static { $this->label = $label; return $this; } public function exporter(?Exporter $exporter): static { $this->exporter = $exporter; return $this; } public function enabledByDefault(bool | Closure $condition): static { $this->isEnabledByDefault = $condition; return $this; } public function getName(): string { return $this->name; } public function getExporter(): ?Exporter { return $this->exporter; } public function isEnabledByDefault(): bool { return (bool) $this->evaluate($this->isEnabledByDefault); } public function getRecord(): ?Model { return $this->getExporter()?->getRecord(); } public function getLabel(): ?string { return $this->evaluate($this->label) ?? (string) str($this->getName()) ->beforeLast('.') ->afterLast('.') ->kebab() ->replace(['-', '_'], ' ') ->ucfirst(); } public function applyRelationshipAggregates(EloquentBuilder $query): EloquentBuilder { return $query->when( filled([$this->getRelationshipToAvg(), $this->getColumnToAvg()]), fn ($query) => $query->withAvg($this->getRelationshipToAvg(), $this->getColumnToAvg()) )->when( filled($this->getRelationshipsToCount()), fn ($query) => $query->withCount(Arr::wrap($this->getRelationshipsToCount())) )->when( filled($this->getRelationshipsToExistenceCheck()), fn ($query) => $query->withExists(Arr::wrap($this->getRelationshipsToExistenceCheck())) )->when( filled([$this->getRelationshipToMax(), $this->getColumnToMax()]), fn ($query) => $query->withMax($this->getRelationshipToMax(), $this->getColumnToMax()) )->when( filled([$this->getRelationshipToMin(), $this->getColumnToMin()]), fn ($query) => $query->withMin($this->getRelationshipToMin(), $this->getColumnToMin()) )->when( filled([$this->getRelationshipToSum(), $this->getColumnToSum()]), fn ($query) => $query->withSum($this->getRelationshipToSum(), $this->getColumnToSum()) ); } public function applyEagerLoading(EloquentBuilder $query): EloquentBuilder { if (! $this->hasRelationship($query->getModel())) { return $query; } $relationshipName = $this->getRelationshipName(); if (array_key_exists($relationshipName, $query->getEagerLoads())) { return $query; } return $query->with([$relationshipName]); } protected function resolveDefaultClosureDependencyForEvaluationByName(string $parameterName): array { return match ($parameterName) { 'exporter' => [$this->getExporter()], 'options' => [$this->getExporter()->getOptions()], 'record' => [$this->getRecord()], default => parent::resolveDefaultClosureDependencyForEvaluationByName($parameterName), }; } protected function resolveDefaultClosureDependencyForEvaluationByType(string $parameterType): array { $record = $this->getRecord(); return match ($parameterType) { Exporter::class => [$this->getExporter()], Model::class, $record ? $record::class : null => [$record], default => parent::resolveDefaultClosureDependencyForEvaluationByType($parameterType), }; } }