我正在尝试从一个表中选择所有结果,并在用户ID匹配时与另一个表合并。
我有三个表:运行,用户和run_user数据透视表。我想从数据库表中的'运行'和其他列中选择所有结果('已完成','粘'','last_tested'和'难度'),但只从当前用户的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'
有关如何通过查询生成器执行此操作的任何建议吗?我可以在Laravel 4中进行LEFT JOIN,但也无法弄清楚如何将它与AND语句结合起来。
感谢任何帮助。
谢谢!
答案 0 :(得分:34)
根据您的要求,您可以使用查询构建器进行查询:
DB::table('runs')
->leftJoin('run_user', function($join)
{
$join->on('run_user.run_id', '=', 'runs.id')
->on('run_user.user_id', '=', '2');
})
->get();
但是JOIN语句看起来有点奇怪,你可能想把它变成普通的WHERE(除非你有一个非常具体的理由直接在JOIN子句中过滤)。
DB::table('runs')->join('run_user', 'run_user.run_id', '=', 'runs.id')->where('run_user.user_id', '=', '2')->get();
答案 1 :(得分:9)
如果有人想知道我在其中一个leftJoin参数上使用DB :: raw工作:
DB::table('runs')
->leftjoin('run_user', 'runs.id','=',
DB::raw('run_user.run_id AND run_user.user_id = ' . $user->id))
->get();
它并不像我希望的那样'雄辩',但如果你想在LEFT JOIN中添加一个AND,那么这似乎是唯一的方法。
如果有人能提出一种我更想知道的更简洁的方式!
由于
答案 2 :(得分:1)
在Laravel 4中,您可以使用Eloquent查询执行此操作。我假设您了解Eloquent关系并知道创建模型。 对于您的查询,它应该是
RunUser::where('user_id',$id)->leftjoin('runs','runs.id','=','run_user.run_id')->first();
注意 RunUser是run_user表的模型。
答案 3 :(得分: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();
答案 4 :(得分:0)
Provident和用户表加入并获取所有详细信息的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;
答案 5 :(得分:0)
这是必须的:
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();