Можно ли рассчитать среднее значение в одном запросе с помощью Eloquent с двумя отношениями hasMany? - PullRequest
0 голосов
/ 14 сентября 2018

Мой текущий подход выглядит так:

public function overallAverage() 
{
    $ids = $this->reviews()->pluck('id')->all();

    return Rating::where('rating_type_id', 0)
                  ->whereIn('offer_review_id', $ids)
                  ->avg('rating_value');
}

Но мне не нравится, что мне сначала нужно собрать все идентификаторы, чтобы вычислить средние значения. Чтобы понять это лучше, вот схема моих таблиц:

enter image description here

Поэтому, когда у меня есть Предложение, я хочу вычислить все средние значения рейтингов, у которых рейтинг_типа_идентификатора равен 0.

1 Предложение имеет много отзывов. В одном обзоре предложений есть много оценок (например, общая оценка, оценка вкуса, оценка стоимости и т. Д.).

С отзывами () Я получаю много отношений

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

1 Ответ

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

Да, вы можете получить среднее значение, используя коллекцию laravel.Laravel предоставляет нам количество вспомогательных функций сбора, которые предоставляют нам гибкость для вычисления значений.

Ниже avg вспомогательная функция сбора использует

https://laravel.com/docs/5.7/collections#method-average

public function overallAverage() 
{
    $reviewTableName = $this->reviews()->getTable();

    $query = "select id from $reviewTableName";
    $avg = Rating::where('rating_type_id', 0)
                ->whereRaw("offer_review_id in ($query)")
                ->pluck('rating_value')
                ->avg();
    return $avg;
}

Я думаю, что это поможет вам.

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