allTags
- это статический метод, который должен вызываться непосредственно в модели. Когда вы начнете добавлять ограничения или цепочку для метода отношений в модель Eloquent
, будет возвращен экземпляр Builder
.
Я бы предложил, если вы еще этого не сделали, создать модель Tag
, которая расширяет \Cviebrock\EloquentTaggable\Models\Tag
, а затем определить отношения для песен. Ваша модель будет выглядеть примерно так:
namespace App;
class Tag extends \Cviebrock\EloquentTaggable\Models\Tag
{
/**
* Songs Relationship.
*
* @return \Illuminate\Database\Eloquent\Relations\MorphToMany
*/
public function songs()
{
return $this->morphedByMany(Song::class, 'taggable', 'taggable_taggables', 'tag_id', 'taggable_id');
}
}
Если у вас уже есть модель, но у вас нет отношений, просто добавьте вышеуказанные отношения к этой модели.
Тогда вы сможете получить все теги с помощью:
$tags = Tag::whereHas('songs.artist', function ($query) {
$query->where('language', 'hindi');
})->orderBy('count', 'DESC')->get();
Если вы не хотите создавать новую модель, вы можете сделать что-то вроде:
Song::with('tags')
->whereHas('artist', function ($query) {
$query->where('language', 'hindi');
})
->get()
->flatMap(function ($song) {
return $song->tags;
})
->unique()
->sortByDesc('count');
Для получения более подробной информации о коллекции, пожалуйста, ознакомьтесь с документацией