Laravel 5.6 - установка правильных отношений для активной нагрузки - PullRequest
0 голосов
/ 28 мая 2018

Настройка игрового сайта.У меня есть 3 таблицы.Пользователь, rank (думаю, что военный), и таблица rank_history.

Rank:
id, name, abbr, level, nextlevel, mintime


RankHistory:
id, user_id, rank_id, promoter, reason, created_at

public function User()
{
    return $this->belongsToMany(User::class);
}

public function PromotedBy()
{
    return $this->belongsToMany(User::class, 'rank_history', 'id', 'promoter');
}

public function Rank()
{
    return $this->belongstoMany(Rank::class);
}


user:
id, name, yadda (standard user stuff; nothing relevant)

public function RankHistory()
{
    return $this->hasMany(RankHistory::class);
}

Я использую историю рейтингов как способ устанавливать поощрения, понижения в должности и иметь историю.в конечном итоге я бы хотел иметь возможность набирать $user->rank_detail($detail) и возвращать либо аббревиатуру, имя, уровень, что угодно.

user.php

protected $with = ['rankhistory'];

public function rank_detail($detail)
{
    $rankId = $this->RankHistory->pluck('rank_id')->last();

    if (!$rankId) { $rankId = 1;}

    return Rank::where('id', $rankId)->value($detail);
}

это работает, но он выполняет отдельный запрос запроса, чтобы попасть в таблицу рангов, чтобы получить подробности.Так как это довольно безопасно, мне понадобится информация о рейтинге, когда я получу пользователя, для меня достаточно смысла загружать их.Вопрос в том, как?Я пробовал hasmanythrough, hasmany, даже пытался добавить $with =[ rankhistory.rank'] ничего не работает.Я также знаю, что это можно решить, добавив столбец рейтинга в пользовательскую таблицу, но там, где это возможно, пользователь будет часто менять рейтинг, я хотел, чтобы пользовательская таблица была как можно более чистой.Кроме того, наличие таблицы истории дает пользователю запись.

Итак, вопрос заключается в следующем: что мне нужно надеть пользователю (и / или другим файлам), чтобы быстро загрузить информацию о ранге с пользователем?

Также следует отметить, что промоутером в таблице ранхистории является FK для идентификатора в таблице пользователей.Как бы мне получить эти отношения?прямо сейчас я могу вернуть $ history-> promoter, и он даст мне идентификатор. Как я могу получить информацию о пользователе без лишних запросов?

1 Ответ

0 голосов
/ 29 мая 2018

Попробуйте это:

class User
{
    protected $with = ['rankHistory.rank'];

    public function rankHistory()
    {
        return $this->hasOne(RankHistory::class)->latest();
    }

    public function rank_detail($detail)
    {
        if ($this->rankHistory) {
            return $this->rankHistory->rank->$detail;
        }            

        return Rank::find(1)->$detail;
    }
}

class RankHistory
{
    public function rank()
    {
        return $this->belongsTo(Rank::class);
    }
}
...