Лучше, чтобы ваши методы определения отношений были как можно более простыми.
public function reviews(){
return $this->hasMany('App\Review');
}
Теперь вы можете использовать это отношение, чтобы получить показатель.Вы можете сделать это по-разному:
1.Добавляя его как добавленное свойство :
Вы можете добавить свойство, которое не является столбцом в вашей модели, в качестве добавленного свойства.
protected $appends = ['rate'];
, а затеместь функция для присвоения значения:
public functions getRateAttribute(){
return $this->reviews->avg('rate') ?? 0;
}
Проблема в том, что добавленное свойство, как следует из названия, всегда добавляется к экземпляру модели.
Так что, если вы простовыполните следующие действия:
$product = Product::first();
Даже если вам не нужна ставка, у laravel все равно будет готово $product->rate
для вас, и из-за этого он будет выполнять средний запрос.
2.Имея это в качестве метода:
Это вариант, когда вы можете просто создать его как метод:
public functions getRate(){
return $this->reviews->avg('rate') ?? 0;
}
Преимущество этого заключается в том, что вы можете использовать его, когда вам нужно,Это экономит массу ненужных запросов, которые выполняет функция добавленного свойства, даже если она вам не нужна.
Это можно затем использовать:
$product = Product::first();
// The query fo average will be done below only when you call `getRate` on `$product`
$rate = $product->getRate();
Я бы сделал это как вариант 2, еслиУ меня был выбор.
Также хедс-ап на Laravel's avg('column_name)
:
- Это дает
null
, когда нет данных - Это дает значение что-то вроде
0.0
еслиВы усредняете нечисловой столбец - Дает допустимое значение в формате
3.9265
, если присутствует значение, которое превышает 2 десятичных знака (в основном 4)
Таким образом, вы можете иметьваша функция соответственно.