Первоначально я предлагаю, чтобы имя отношения тегов () объекта Taggable должно было быть только тегом ().
Тогда у объекта Taggable должен быть собственный «id», подобный этому:
Schema::create('taggables', function (Blueprint $table) {
$table->increments('id');
$table->integer('tag_id');
$table->integer('taggable_id');
$table->string('taggable_type');
$table->timestamps();
});
Наконец, объект Taggable должен иметь полиморфное отношение, подобное этому:
/**
* @return \Illuminate\Database\Eloquent\Relations\MorphTo
*/
public function taggable()
{
return $this->morphTo();
}
public function tag()
{
return $this->belongsTo('App\Tag');
}
Таким образом, вы можете получить доступ к имени тега с помощью следующего кода:
$topTags = Taggable::whereDate('created_at', '>=', now()->subHours(4))
->groupBy('tag_id')
->orderByRaw('count(tag_id) DESC'))
->take(4)
->with('tag')
->get();
foreach($topTags as $ttag){
$ttag->tag->name;
}
Не забудьте добавить вдругие объекты, связанные с Taggable:
/**
* @return \Illuminate\Database\Eloquent\Relations\morphMany
*/
public function taggables()
{
return $this->morphMany(Taggable::class, 'taggable');
}
Использование отношения Taggable, например:
$anyOtherModel->taggables()->create([
'tag_id' => $tag->id,
]);