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ステートメントと組み合わせる方法もわかりません。
どんな助けも大歓迎です。
ありがとう!
あなたが要求したように、これはクエリビルダーでクエリを行う方法です:
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();
誰かが疑問に思っている場合は、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に追加する場合の唯一の方法のようです。
誰かがきちんとした方法を提案できるなら、私は知りたいです!
ありがとう
Laravel 4では、Eloquentクエリを使用してこれを行うことができます。
RunUser::where('user_id',$id)->leftjoin('runs','runs.id','=','run_user.run_id')->first();
注 RunUserはrun_userテーブルのモデルです。
これを使って
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();
プロビデントおよびユーザーテーブル参加し、すべての詳細への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;
動作する必要があります:
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();