猿问

调用字符串上的成员函数 addEagerConstraints()

我想计算嵌套变形关系列的平均值。




模型功能


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而是给出错误。


Cats萌萌
浏览 123回答 2
2回答

白衣非少年

因为with()需要得到关系。addEagerConstraints来自源代码。当您使用即时加载时,您的关系构建器将调用addEagerConstraints.但是,您的关系方法是返回字符串(的结果avg())而不是变形关系。所以会发生错误。你可以改变你的方法,如:public function trader_ratings(){    return $this->morphMany(TraderRatings::class, 'rateable')->select('*', DB::raw('AVG(rating) AS avg_rating'));}

qq_笑_17

该错误清楚地表明 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
随时随地看视频慕课网APP
我要回答