Laravel Метод avg () Query Builder, проблема с числом с плавающей запятой - PullRequest
0 голосов
/ 21 апреля 2020

Попытка создать 5-звездочную рейтинговую систему в Laravel. Звездная скорость - это число с плавающей точкой в ​​диапазоне [от 1 до 5], и оно успешно сохраняется в базе данных. файл миграции для таблицы ставок в базе данных. (Я установил тип данных звездного столбца как число с плавающей запятой)

public function up()
{
    Schema::create('rates', function (Blueprint $table) {
        $table->id();
        $table->morphs('rateble');     //creates rateable_id  and  rateable_type
        $table->foreignId('user_id')->nullable()->constrained()->onUpdate('cascade')->onDelete('set null');
        $table->float('star',2, 1);    //star number is from 0 to 5 
        $table->timestamps();
    });
}

Затем для усреднения рейтинга для определенного продукта c я использую этот запрос:

public function scopeAverageRate($query, $type, $id)
{
    return $query->where('rateble_type', $type)
                 ->where('rateble_id', $id)
                 ->avg('star');
}

Проблема, кажется, что метод avg() приводит результат к целому числу! Есть ли способ настроить эту функцию для работы с числами с плавающей запятой?

Например, предположим, что для указанного продукта c есть только одна ставка, равная "0,5" звездочек, тогда средний рейтинг вместо этого равен "0". из "0.5"!

Как я могу решить эту проблему?

Заранее спасибо,

1 Ответ

0 голосов
/ 21 апреля 2020

Правильный ответ - написать необработанную sql для усредненной функции, например:

->selectRaw('CAST(AVG(star) AS DECIMAL(2,1)) AS star_avg')->first()->star_avg;

Обратите внимание, что star - это имя столбца, для которого мы хотели бы усреднить его значение.

для получения дополнительной информации: здесь

...