Laravel 4 查询生成器:左连接 ...和。。。查询

2022-08-30 21:37:51

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

我有三个表:运行,用户和run_user数据透视表。我想从“运行”和数据透视表中的其他列中选择所有结果(它们是“已完成”,“粘性”,“last_tested”和“难度”),但仅从当前用户的run_user中提取数据。

在原始 SQL 中,我设法通过带有 AND 语句的左连接来执行此操作:

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中做左联接,但不知道如何将其与AND语句相结合。

任何帮助是值得赞赏的。

谢谢!


答案 1

按照您的要求,以下是使用查询生成器执行查询的方式:

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


答案 2

如果有人想知道,我在左加入参数之一上使用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的唯一方法。

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

谢谢


推荐