#php #laravel
#php #laravel
Вопрос:
Моя таблица выглядит следующим образом.
id | restaurant_id | user_id | rating | comment
1 1 2 3.5 comment1
2 1 2 2.1 comment2
3 1 2 4.1 comment3
4 1 2 1.6 comment4
Теперь у меня есть restaurant_id как 1. я хочу получить максимальный рейтинг (4.1), минимальный рейтинг (1.6) и средний рейтинг (какой бы он ни был). Я делаю это правильно, но я также хочу получить комментарий. что-то вроде этого:
{
"data": [
max:{
max_rating:4.1,
comment:"comment 3",
id: 3
},
min:{
min_rating:1.6,
comment: "comment 4",
id: 4,
}
avg:{
avg_rating:"whatever it is",
//this won't have comment and id at all.
}
]
}
Я пытался:
$data = AppHttpModelsReview::select("id", "comment",DB::raw("MAX(rating) AS max_price, MIN(rating) AS min_price"))
->where("restaurant_id", 1)
->groupBy("id")
->get();
но не работает, как я объяснил.
Ответ №1:
Более простое решение — выполнить 3 отдельных запроса:
$avg = Review::select(DB::raw('avg(rating) as avg_rating')
->where('restaurant_id', 1)
->groupBy('restaurant_id')
->get();
$max = Review::select('id','comment','rating')
->where('restaurant_id', 1)
->orderBy('rating','DESC')
->first();
$min = Review::select('id','comment','rating')
->where('restaurant_id', 1)
->orderBy('rating','ASC')
->first();
$json = json_encode(['data' => [
'avg' => $avg,
'max' => $max,
'min' => $min
]]);
Вы могли бы извлечь значения max, min и average с помощью одного запроса, но без указания идентификатора и комментария к max / min:
$stats = Review::select(DB::raw('avg(rating) as avg_rating, max(rating) as max_rating, min(rating) as min_rating')
->where('restaurant_id', 1)
->groupBy('restaurant_id')
->get();
Ответ №2:
Я бы попробовал эти :
$average = AppHttpModelsReview::where("restaurant_id", 1)->avg('rating');
$max = AppHttpModelsReview::where("restaurant_id", 1)->max('rating');
$min = AppHttpModelsReview::where("restaurant_id", 1)->min('rating');
Если вам нужно вычислить эти значения для многих ресторанов одновременно, запрос, написанный в вашем сообщении, был бы хорошим началом. Какой результат это дает вам вместо ожидаемых значений?
Комментарии:
1.
$max
и$min
не включал бы идентификатор и комментарий, но эти методы великолепны, и я их не знал. Спасибо!2. Какой результат это дает вам вместо ожидаемых значений?
Ответ №3:
Простой способ получить минимальные, максимальные и средние значения в одном запросе Laravel
$stats=stats::where('userid',Auth::User()->id)->get();
$min=$stats->min('point');
$max=$stats->max('point');
$avg=$stats->avg('point');