Вызов функции-члена addEagerConstraints () для строки - PullRequest
0 голосов
/ 24 января 2020

Я хочу вычислить среднее значение столбца отношения вложенных морфов.



Функция модели

public function trader_ratings()
{
    return $this->morphMany(TraderRatings::class, 'rateable')
        ->select('rateable_id', 'rateable_type', 'rating')
        ->avg('rating');
}

Контроллер с отложенной загрузкой

$user = auth('api')->user();
$user_id = $user->id;
$customer_classes = CustomerClassBooking::with([
    'trader_class',
    'trader_class.trader_ratings',
    'vendor',
])
    ->where('customer_id', $user_id)
    ->where('status', 'Accepted-paid')
    ->get();

Не вычисляется avg, но выдается ошибка.

Ответы [ 2 ]

1 голос
/ 24 января 2020

Потому что with() нужно получить отношения. addEagerConstraints из исходного кода. Когда вы используете энергичную загрузку, ваш построитель отношений будет вызывать addEagerConstraints.

Однако ваш метод отношений возвращает строку (результат avg()) вместо отношения морфинга. Таким образом, возникает ошибка.

Вы можете изменить свой метод так:

public function trader_ratings()
{
    return $this->morphMany(TraderRatings::class, 'rateable')->select('*', DB::raw('AVG(rating) AS avg_rating'));
}
0 голосов
/ 24 января 2020

Ошибка ясно говорит о том, что trader_ratings уже вычислил среднее значение и больше не является экземпляром компоновщика, который вам понадобится для быстрой загрузки. так что, может быть, сделать что-то, как показано ниже, (не проверял код, просто из головы)

public function trader_ratings()
{
  return $this->morphMany(TraderRatings::class, 'rateable')->select('rateable_id','rateable_type','rating');
 }


// Then

$customer_classes = CustomerClassBooking::with([
         'trader_class',
         'trader_class.trader_ratings' => function($query`){
            $query->avg('rating)
         },

        ,'vendor'])-> // rest of query
...