web-dev-qa-db-ja.com

Laravel 4 Query Builder:LEFT JOIN ... AND ... query

1つのテーブルからすべての結果を選択し、ユーザーIDが一致したときに別のテーブルとマージしようとしています。

Run、users、run_userピボットテーブルの3つのテーブルがあります。 「runs」からのすべての結果とピボットテーブルの追加列(「completed」、「sticky」、「last_tested」、「difficulty」)を選択しますが、現在のユーザーのrun_userからのみデータを取得します。

生のSQLでは、ANDステートメントでLEFT JOINを介してこれを行うことができました。

SELECT
runs.startpoint,
runs.startpostcode,
runs.endpoint,
runs.endpostcode,
run_user.completed,
run_user.sticky,
run_user.last_tested,
run_user.difficulty
FROM runs
LEFT JOIN run_user ON run_user.run_id=runs.id AND run_user.user_id = '2'

クエリビルダーを使用してこれを行う方法はありますか? LEFT JOINをLaravel 4で実行できますが、これをANDステートメントと組み合わせる方法もわかりません。

どんな助けも大歓迎です。

ありがとう!

16
user2324369

あなたが要求したように、これはクエリビルダーでクエリを行う方法です:

DB::table('runs')
        ->leftJoin('run_user', function($join)
        {
            $join->on('run_user.run_id', '=', 'runs.id')
            ->on('run_user.user_id', '=', '2');
        })
        ->get();

しかし、そのJOINステートメントは少し奇妙に見えますが、JOIN句で直接フィルターする特別な理由がない限り、通常のWHEREに変更したいでしょう。

DB::table('runs')->join('run_user', 'run_user.run_id', '=', 'runs.id')->where('run_user.user_id', '=', '2')->get();

ドキュメント: http://laravel.com/docs/queries#joins

34

誰かが疑問に思っている場合は、leftJoinパラメーターの1つでDB :: rawを使用してこれを動作させました:

DB::table('runs')
    ->leftjoin('run_user', 'runs.id','=', 
      DB::raw('run_user.run_id AND run_user.user_id = ' . $user->id))
    ->get();

私が望むほど「雄弁」ではありませんが、「andOn」条件が機能しない場合、これがANDをLEFT JOINに追加する場合の唯一の方法のようです。

誰かがきちんとした方法を提案できるなら、私は知りたいです!

ありがとう

9
user2324369

Laravel 4では、Eloquentクエリを使用してこれを行うことができます。

RunUser::where('user_id',$id)->leftjoin('runs','runs.id','=','run_user.run_id')->first();

RunUserはrun_userテーブルのモデルです。

1

これを使って

DB::table('runs')->select('runs.startpoint','runs.startpostcode','runs.endpoint','runs.endpostcode','run_user.completed','run_user.sticky','run_user.last_tested','run_user.difficulty')
    ->leftJoin('run_user', function($join)
    {
        $join->on('run_user.run_id', '=', 'runs.id')
        ->where('run_user.user_id', '2');
    })
    ->get();
1
Saurav Lal Karn

プロビデントおよびユーザーテーブル参加し、すべての詳細へのIDを取得します。

   $return = DB::table(config::get('databaseconstants.TBL_USER'))
            ->leftjoin('inex_pf_details', 'inex_users.id', '=', 'inex_pf_details.pf_user_id')
            ->select('inex_pf_details.*','inex_users.*')
            ->where('inex_pf_details.id', $id)
            ->first();
    return $return;
0
Hardik Hihoriya

動作する必要があります:

DB::table('runs')
        ->leftJoin('run_user', function($join) use ($user_id)
        {
            $join->on('run_user.run_id', '=', 'runs.id')
            ->where('run_user.user_id', '=', $user_id);
        })
        ->get();
0
Denis Ch