首页 文章

Laravel 4 Query Builder:LEFT JOIN ... AND ...查询

提问于
浏览
15

我正在尝试从一个表中选择所有结果,并在用户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语句结合起来 .

任何帮助表示赞赏 .

谢谢!

6 回答

  • 1

    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;
    
  • 8

    用这个

    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();
    
  • 32

    根据您的要求,这是您使用查询构建器进行查询的方式:

    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();
    

    文件:http://laravel.com/docs/queries#joins

  • 0

    如果有人想知道我在其中一个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,那么这似乎是唯一的方法 .

    如果有人能建议一个更整洁的方式,我很想知道!

    谢谢

  • 0

    在Laravel 4中,您可以使用Eloquent查询执行此操作 . 我假设您了解Eloquent关系并知道创建模型 . 对于您的查询,它应该是

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

    Note RunUser是run_user表的模型 .

  • 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();
    

相关问题