Загрузить теги из taggables - PullRequest
       12

Загрузить теги из taggables

0 голосов
/ 16 сентября 2018

Я хотел бы отобразить 4 наиболее часто используемых тега за последние 4 часа с этим кодом:

$topTags = Taggable::whereDate('created_at', '>=', now()->subHours(4))
    ->groupBy('tag_id')
    ->orderByRaw('count(tag_id) DESC'))
    ->take(4)
    ->with('tags')
    ->get();

Таблицы

Schema::create('tags', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name')->unique();
            $table->timestamps();
        });

 Schema::create('taggables', function (Blueprint $table) {
            $table->integer('tag_id');
            $table->integer('taggable_id');
            $table->string('taggable_type');
            $table->timestamps();
        });

Какие отношения мне нужны между таблицей тегов иtaggables?Как я могу получить доступ к имени тега в представлении?Если я использую отношение ownTo:

class Taggable extends Model
{
    protected $fillable = ['tag_id', 'taggable_id', 'taggable_type'];

    public function tags()
    {
        return $this->belongsTo('App\Tag');
    }
}

, массив тегов будет пуст:

 #relations: array:1 [▼
        "tags" => null
      ]

1 Ответ

0 голосов
/ 16 сентября 2018

Первоначально я предлагаю, чтобы имя отношения тегов () объекта 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,
    ]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...