我需要一些查询帮助(使用Laravel框架)。我正在构建一个包含几个列的用户名单,这些列可以包含用户评级。基本上,它选择具有首字母的所有活动用户并加入用户评级表以选择各个用户的评级。 where_in
仅选择特定评分。我的问题是在名单上,它只选择一个评级,而不是所有评级(如果用户有多个评级)。我也试过没有group_by
,但是根据他们的评分数量,用户在桌面上重复(例如:如果用户有2个评级,他们的行在名单上显示两次)。
查询:
$users = DB::table('users')
->where('users.initials', '!=', '')
->left_join('user_ratings', 'user_ratings.uid', '=', 'users.uid')
->where_in('users_ratings.rid', array(6,17,21,20))
->group_by('users.uid')
->order_by('users.name')
->get();
表:
Users
=======
uid name
1 John
2 Jeff
3 Cathy
Ratings
======
rid uid
1 1
2 1
2 2
3 1
4 3
答案 0 :(得分:3)
问题是当你执行left_join时,你得到的结果是多行。因此,如果没有group_by子句,它将在行中返回您想要的所有结果,而不是列,并且对于group_by,它将返回第一个评级(这是预期的行为)。
我建议您只使用Eloquent ORM并设置模型及其关系(它更容易和更清洁)。我猜user_rating是一个多对多的数据透视表?在这种情况下,您将拥有两个模型User和Rating,他们的关系将是has_many_and_belongs_to。此外,laravel中的命名约定按字母顺序具有数据透视表,因此它将被称为“rating_user”。在此处查看如何设置关系:http://laravel.com/docs/database/eloquent#relationships
一旦建立了与他们的关系的模型,我会做的是
$users = User::where('initials', '!=', '')->order_by('name')->get();
然后,
foreach($users as $user) {
echo "Ratings for " .$user->name . ": ";
$ratings = $user->ratings()->pivot()->where_in('rid', array(6,17,21,20))->get();
foreach($ratings as $rating) {
however you want to display the ratings here...
}
}
这可能不是最有效的方法,但鉴于我的假设是正确的,它应该完成工作。
答案 1 :(得分:1)
快速查看the documentation可以看出,Fluent Query Builder只能执行MySQL可以执行的操作,并且MySQL无法将数组返回给客户端。
请查看this question以了解替代方案。
如果你想要Laravel fetch the ratings for you, you need to build a model。