Laravel, отсортировать результат по полю из таблицы отношений? - PullRequest
0 голосов
/ 29 марта 2020

У меня есть список игроков и другая таблица со статистикой игры.

Мой код списка:

$gamers = Gamer::with(['lastGameStat' => function($query) {
    $query->orderBy('total_points', 'DESC');
}])->paginate(20);

отношение:

public function lastGameStat() {
        return $this->hasOne(GameStat::class, 'gamer_id', 'id')->orderBy('created_at', 'DESC');
    }

в таблице отношений У меня есть поле: total_points и с этим кодом я подумал, что можно отсортировать список игроков по total_points $query->orderBy('total_points', 'DESC');

Это не работает, может кто-нибудь дать мне совет, как я могу отсортировать результат на поле из таблицы отношений?

1 Ответ

1 голос
/ 29 марта 2020

Полагаю, вам понадобятся либо другое отношение, либо пользовательские области действия для получения различной игровой статистики игрока.

Второе отношение

Геймер. php ( Ваша модель)

class Gamer
{
    public function bestGameStat()
    {
        return $this
            ->hasOne(GameStat::class)
            ->orderBy('total_points', 'DESC');
    }
}

Пользовательские области действия

Gamer. php

class Gamer
{
    public function gameStat()
    {
        return $this->hasOne(GameStat::class);
    }
}

GameStat. php

use Illuminate\Database\Eloquent\Builder;

class GameStat
{
    public function scopeBest(Builder $query)
    {
        return $query->orderBy('total_points', 'DESC');
    }
}

В вашем контроллере:

$gamersWithTheirLatestGameStatistic = Gamer::with(['gameStat' => function($query) {
    $query->latest();
}])->paginate(20);

$gamersWithTheirBestGameStatistic = Gamer::with(['gameStat' => function($query) {
    $query->best();
}])->paginate(20);

Помните, что это непроверенный код и он может не работать.

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