diff --git a/src/HasTags.php b/src/HasTags.php index a45820b..7cdfa5b 100644 --- a/src/HasTags.php +++ b/src/HasTags.php @@ -8,6 +8,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\MorphToMany; use Illuminate\Support\Arr; +use Illuminate\Support\Str; use InvalidArgumentException; trait HasTags @@ -19,6 +20,20 @@ public static function getTagClassName(): string return config('tags.tag_model', Tag::class); } + protected function getTagsThroughClass() { + if (isset(static::$taggedModel)) { + // This has to be the least effective way to do this... + $model = static::$taggedModel; + $instance = new $model; + $source = Str::singular(class_basename($instance)) . '.tags'; + } + else { + $source = "tags"; + } + + return $source; + } + public function getTaggableMorphName(): string { return config('tags.taggable.morph_name', 'taggable'); @@ -93,7 +108,7 @@ public function scopeWithAllTags( $tags = static::convertToTags($tags, $type); collect($tags)->each(function ($tag) use ($query) { - $query->whereHas('tags', function (Builder $query) use ($tag) { + $query->whereHas($this->getTagsThroughClass(), function (Builder $query) use ($tag) { $query->where('tags.id', $tag->id ?? 0); }); }); @@ -109,7 +124,7 @@ public function scopeWithAnyTags( $tags = static::convertToTags($tags, $type); return $query - ->whereHas('tags', function (Builder $query) use ($tags) { + ->whereHas($this->getTagsThroughClass(), function (Builder $query) use ($tags) { $tagIds = collect($tags)->pluck('id'); $query->whereIn('tags.id', $tagIds); @@ -124,7 +139,7 @@ public function scopeWithoutTags( $tags = static::convertToTags($tags, $type); return $query - ->whereDoesntHave('tags', function (Builder $query) use ($tags) { + ->whereDoesntHave($this->getTagsThroughClass(), function (Builder $query) use ($tags) { $tagIds = collect($tags)->pluck('id'); $query->whereIn('tags.id', $tagIds); @@ -138,7 +153,7 @@ public function scopeWithAllTagsOfAnyType(Builder $query, $tags): Builder collect($tags) ->each(function ($tag) use ($query) { $query->whereHas( - 'tags', + $this->getTagsThroughClass(), fn (Builder $query) => $query->where('tags.id', $tag ? $tag->id : 0) ); }); @@ -153,7 +168,7 @@ public function scopeWithAnyTagsOfAnyType(Builder $query, $tags): Builder $tagIds = collect($tags)->pluck('id'); return $query->whereHas( - 'tags', + $this->getTagsThroughClass(), fn (Builder $query) => $query->whereIn('tags.id', $tagIds) ); }