Laravel: Выбор элементов с условием WHERE в объединенной таблице - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть две таблицы (фильмы и обзоры).Один фильм имеет множество обзоров и один отзыв принадлежит одному фильму

Отношения: Film.php

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

и Review.php

public function film()
{
    return $this->belongsTo('App\Film');
}

Так как я использую отношения Laravel EloquentЯ хочу составить список фильмов, упорядоченных по отзывам, используя Eloquent.Обзоры идут от 0 = без оценки до 5 = максимальная оценка.

На простом английском мне нужно:

  • присоединиться к двум столам
  • получить все фильмы, которыеесть отзывы
  • сгруппировать по film_id
  • вычислить среднее значение (один фильм может иметь много отзывов, поэтому мне нужно среднее)
  • организовать получившийся список
  • получитьсписок

Мои решения с использованием Query Builder выдают ошибку:

$best_films = DB::table('films')
             ->join('reviews', 'reviews.film_id', '=', 'films.id')
             ->select('films.id', 'avg(reviews.rating)')
             ->groupBy('films.id')
             ->orderByRaw('avg(reviews.rating) DESC')
             ->get();

При этом я получаю следующую ошибку: Столбец не найден: 1054 Неизвестный столбец 'avg (reviews.rating)' ...

Использование Eloquent ORM Я не могу упорядочить по столбцам в другой таблице.Что-то подобное не работает:

 $films = Film::whereHas('reviews')->orderBy('reviews.film_id', 'desc')->get();

Я получаю сообщение об ошибке: Столбец не найден: 1054 Неизвестный столбец 'reviews.film_id' в 'предложении заказа' ...

Мой вопрос: есть идеи, как решить эту проблему?(Я бы предпочел использовать Eloquent Orm)

Ответы [ 2 ]

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

Я думаю, что вы должны использовать короткие данные в своей реляционной модели, например:

public function reviews() { return $this->hasMany('App\Review')->orderBy('film_id', 'desc'); }

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

Вы должны попробовать это

best_films = DB::table('films')
             ->join('reviews', 'reviews.film_id', '=', 'films.id')
             ->select('films.id', DB::raw('avg(reviews.rating)'))
             ->groupBy('films.id')
             ->orderByRaw('avg(reviews.rating) DESC')
             ->get();
...