Php 选择列表不在GROUP BY子句中,并且包含未聚合的列“explore.ratings.id”
我想做的是选择行程,然后按比率分组 注:评级是一种多态关系 鉴于我们有两种型号:Php 选择列表不在GROUP BY子句中,并且包含未聚合的列“explore.ratings.id”,php,mysql,laravel,laravel-5,laravel-5.6,Php,Mysql,Laravel,Laravel 5,Laravel 5.6,我想做的是选择行程,然后按比率分组 注:评级是一种多态关系 鉴于我们有两种型号: trips id => int price => float city_id => uint ........ ratings: id => int ratable_id => int ratable_type=> varchar rate => small-int ...... 下面是我如何做到这一点的: \App\Models\Trip:
trips
id => int
price => float
city_id => uint
........
ratings:
id => int
ratable_id => int
ratable_type=> varchar
rate => small-int
......
下面是我如何做到这一点的:
\App\Models\Trip::where('price','>=','100')->with(['ratings' => function ($query) {
$query->groupBy('ratings.rate');
}])->get();
哎呀
SQLSTATE[42000]:语法错误或访问冲突:1055表达式1
of SELECT列表不在GROUP BY子句中,并且包含未聚合的
“explore.ratings.id”列,该列在功能上不依赖于
按子句分组的列;这是不符合的
sql_mode=仅_full_group_按sql:从评级中选择*,其中
1、2中的ratings.ratable_id和ratings.ratable_类型=
App\Models\Trip group by rations.rate
使用不同的方法:
$grouped = [];
$trips = \App\Models\Trip::where('price', '>=', '100')->with('ratings')->get();
foreach($trips as $trip) {
foreach($trip->ratings as $rating) {
$grouped[$rating->rate][] = $trip;
}
}
或使用连接:
$trips = \App\Models\Trip::select('trips.*', 'ratings.rate')
->join('ratings', 'ratings.ratable_id', 'trips.id')
->where('ratings.ratable_type', 'App\Models\Trip')
->where('trips.price', '>=', '100')
->get();
$grouped = $trips->groupBy('rate');
@MKhalidJunaid你的答案不是我想要的,你没有明白我说的@MKhalidJunaid none解决了我的问题,这就是为什么我尝试提出不同的解决方案奇怪的是,对于你的问题,这将帮助你前进,每次旅行可以有多个评级。您想使用哪一种方法进行分组?@MKhalidJunaid谢谢,我已经在看了。我正在避免使用这种方法,因为环路中存在N1+问题,行程越多,您必须进行的环路越多,为了收集它,这将是我的最后一个解决方案tho,如果我不能在mysql中一次完成它,你是说N+1查询问题吗?不是查询,因为它是迫不及待地加载的,而是循环本身,如果有很多评级,那么它本身将是昂贵的,从长远来看,这将是…我添加了一个不同的解决方案。