Как получить allTags () в laravel от отфильтрованной модели - PullRequest
0 голосов
/ 30 августа 2018

У меня есть две модели Song и Album.

Song is Taggable (используется eloquent-taggable).

1) Песня принадлежит альбому.

Альбом содержит название и язык столбцов.

Я хочу получить все теги песни для определенного языка альбома.

Я пытался

Song::join('albums','albums.id','=','songs.album_id')
     ->where('albums.language', 'hindi')
     ->allTags()->orderBy('count', 'DESC')->get(); 

Но не работает.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Сначала создайте отношение к песне и альбому как:

namespace App;

use Illuminate\Database\Eloquent\Model;
use Cviebrock\EloquentTaggable\Taggable;

    class Song extends Model
    {
        use Taggable;
        protected $fillable = ['name','title','album_id'];
        public $timestamps = false;

        public function album() {
            return $this->belongsTo(Album::class, 'album_id');
        }
    }

, а затем сделать запрос как:

$songs = Song::with(['album','tags'])->whereHas('album', function($q) {
                    $q->where('language', '=', 'hindi');
                })->get();

Это вернет вам все песни, которые принадлежат альбомам с тэгами "хинди".

0 голосов
/ 31 августа 2018

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');

Для получения более подробной информации о коллекции, пожалуйста, ознакомьтесь с документацией

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...