为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
Cats萌萌 2022-07-29 16:27:09
我想计算嵌套变形关系列的平均值。模型功能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 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

因为with()需要得到关系。addEagerConstraints来自源代码。当您使用即时加载时,您的关系构建器将调用addEagerConstraints.


但是,您的关系方法是返回字符串(的结果avg())而不是变形关系。所以会发生错误。


你可以改变你的方法,如:


public function trader_ratings()

{

    return $this->morphMany(TraderRatings::class, 'rateable')->select('*', DB::raw('AVG(rating) AS avg_rating'));

}


查看完整回答
反对 回复 2022-07-29
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

该错误清楚地表明 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


查看完整回答
反对 回复 2022-07-29
  • 2 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信