0

我需要一些查询帮助(使用 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
4

2 回答 2

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...
    }
}

这可能不是最有效的方法,但鉴于我的假设是正确的,它应该可以完成工作。

于 2012-12-29T13:56:52.923 回答
1

快速浏览一下文档就会发现,Fluent Query Builder 只能做 MySQL 可以做的事情,而 MySQL 不能将数组返回给客户端。

看看这个问题,看看你的替代方案。

如果你想让 Laravel为你获取评分,你需要构建一个模型

于 2012-12-29T02:41:21.177 回答