Извлечение имеет много данных о связях Laravel и использует функцию avg - PullRequest
0 голосов
/ 06 июля 2018

Я использую Laravel 5 с vue js. В основном я выбираю данные с помощью axios и пытаюсь отобразить их на веб-странице с помощью директивы vue js v-for. у меня есть таблицы в базе данных, как это:

ratings Table

id review_id rating

Тогда у меня есть

reviews table

id review

Они имеют отношения один ко многим. так вот в моей Review модели у меня есть метод

 public function ratings()
    {
        return $this->hasMany('App\Rating')
            ->selectRaw('review_id,AVG(rating) AS average_rating')
            ->groupBy('review_id');
    }

поэтому здесь я хочу получить список отзывов с их средними оценками. поэтому в моем контроллере я делаю это:

  public function getAllReviews(Request $request)
    {
        $reviews = Review::with('ratings')->get();

        return $reviews;
    }

Итак, я получаю результат, но проблема в том, что в каждом обзоре нет записи рейтингов, поэтому он возвращает ноль? может быть... когда я пытаюсь выполнить рендеринг в шаблоне vue, выдается ошибка undefined, потому что в нашей коллекции некоторые обзоры не имеют оценок.

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

Надеюсь, мне удастся объяснить, что я пытаюсь.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Вы можете сделать это так:

public function getAllReviews(Request $request)
{
    $reviews = Review::selectRaw('*, IFNULL((SELECT AVG(rating) FROM ratings where ratings.review_id = reviews.id), 0) as avg_rating')->get();

    return $reviews;
}
0 голосов
/ 06 июля 2018

Я бы предложил использовать базовые отношения и модифицированное withCount():

public function ratings() {
    return $this->hasMany('App\Rating');
}

$reviews = Review::withCount(['ratings as average_rating' => function($query) {
    $query->select(DB::raw('coalesce(avg(rating),0)'));
}])->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...