【问题标题】:User roster, joining a table but loosing data用户名册,加入表但丢失数据
【发布时间】:2012-12-14 05:35:04
【问题描述】:

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

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

    问题是当您执行 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...
        }
    }
    

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

    【讨论】:

      【解决方案2】:

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

      查看this question 以了解您的替代方案。

      如果你想让 Laravel 到 fetch the ratings for you, you need to build a model.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-05
        • 1970-01-01
        • 2016-01-29
        • 2014-02-15
        相关资源
        最近更新 更多