17

我正在尝试从一个表中选择所有结果并在用户 ID 匹配时与另一个表合并。

我有三个表:运行、用户和一个 run_user 数据透视表。我想从数据透视表中的“运行”和其他列(“完成”、“粘性”、“最后测试”和“难度”)中选择所有结果,但只从 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 语句结合使用。

任何帮助表示赞赏。

谢谢!

4

6 回答 6

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

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

于 2013-07-01T14:12:45.630 回答
13

如果有人想知道我在其中一个 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();

它不像我希望的那样“雄辩”,但是如果没有有效的“andOn”条件,这似乎是您想在 LEFT JOIN 中添加 AND 的唯一方法。

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

谢谢

于 2013-07-01T20:45:43.803 回答
4

用这个

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();
于 2017-05-16T11:53:43.273 回答
1

在 Laravel 4 中,你可以使用 Eloquent 查询来做到这一点。我假设您了解 Eloquent 关系并知道如何创建模型。对于您的查询,它应该是

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

注意RunUser 是 run_user 表的模型。

于 2013-07-01T13:12:42.190 回答
0

提供者和用户表加入并获取所有详细信息的 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;
于 2016-12-22T11:55:41.140 回答
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();
于 2017-06-14T20:43:27.257 回答