0

クエリのヘルプが必要です (Laravel フレームワークを使用)。ユーザーの評価を含むいくつかの列を持つユーザー名簿を作成しています。基本的に、イニシャルを持つすべてのアクティブなユーザーを選択し、ユーザー評価テーブルに参加して、それぞれのユーザーの評価を選択します。特定のwhere_in評価のみを選択することです。私の問題は名簿にあります。すべてではなく、1 つの評価のみが選択されます (ユーザーが複数の評価を持っている場合)。なしでも試してみましたgroup_byが、評価の数に応じてユーザーがテーブルに複製されます (例: ユーザーに 2 つの評価がある場合、その行は名簿に 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 の 2 つのモデルがあり、それらの関係は 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 に答える