Laravel Eloquent - получить счет другой таблицы - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть красноречивая модель "Атлет" и есть еще один настольный перформанс.Каждый спортсмен имеет от 0 до многих выступлений.И я хотел бы получить лучшую производительность каждого спортсмена (личный рекорд) или ноль, если у спортсмена еще нет выступлений.

Моя модель спортсмена:

class Athlete extends Model
{

    // I would like to do something like
    public $personalBest = max(performances) - the highest perfomance

    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'athletes';

    /**
     * The primary key associated with the table.
     *
     * @var string
     */
    protected $primaryKey = 'id';

    /**
     * Indicates if the model should be timestamped.
     *
     * @var bool
     */
    public $timestamps = false;

    /**
     * Get the performances for the Athelete post.
     *
     * @return HasMany
     */
    public function performances()
    {
        return $this->hasMany('App\EloquentModels\Performance', 'athlete_id', "id");
    }
}

Я хотел бы получитьвысочайшая производительность каждого спортсмена.Надеюсь, что это имеет смысл.

Я думаю, что где-то нужно ответить, но мне не повезло найти его.Извините, если я просто не смог его найти.

Performances table
id(int) year(int) performance(float)
-------------------------------------
1       2000      257.3 
2       2001      227.3 

Просто чтобы обернуть вещи.Публикация последнего необработанного запроса:

select [athletes].[first_name], [athletes].[last_name], MAX(performance) AS personal_best
from [athletes] 
left join [performances] on [athletes].[id] = [performances].[athlete_id] 
group by [athletes].[id], [athletes].[first_name], [athletes].[last_name] 
order by [personal_best] desc

1 Ответ

1 голос
/ 19 сентября 2019

Использование withCount должно сделать работу

$athletes= App\Athlete::withCount('performances')->get();

foreach ($athletes as $athlete) {
    echo $athlete->performances_count;
}

Если вы хотите максимальной производительности, вы можете сделать что-то вроде

 $athletes= App\Athlete::all();

    foreach ($athletes as $athlete) {
        echo $athlete->performances->pluck('performance')->max();
    }

Что-то вроде

select e.athelete.id, max(perf.performace) as max_performace
from atheletes ath
  left join performaces perf on ath.id = perf.athelete_id
group by ath.id, max_performace

может быть что-то вроде

DB('athletes as ath')::leftJoin('performaces as perf', 'ath.id', 'perf.athelete_id')->select(e.athelete.id, max(perf.performace) as max_performace)->orderBy('max_performace'); 

Вы можете использовать order by max_performace, если вам нужно.

Я думаю, вы также можете использовать просто

echo $athlete->performances->max('performance');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...