【问题标题】:Laravel query builder join with raw ON expressionLaravel 查询构建器加入原始 ON 表达式
【发布时间】:2018-08-12 12:23:26
【问题描述】:

我正在尝试在 Laravel 5.5 查询构建器中实现以下简化示例:

SELECT *
FROM t
INNER JOIN access
  ON (t.field1 = access.field1 OR t.field2 = access.field2)
     AND access.user_id = :user_id

请注意,ON 在多个字段上都有一个复合表达式,并且还使用了一个参数。

我真的很难让 ON 语句起作用。我已经尝试了join()DB:raw() 我能想到的所有组合。

如何使用 Laravel 的查询构建器来实现这一点?

【问题讨论】:

    标签: sql laravel laravel-5.5


    【解决方案1】:
    DB::table('t')->join('access', function($query) use($user_id) {
        $query->where(function($query) {
            $query->on('t.field1', '=', 'access.field1')
                ->orOn('t.field2', '=', 'access.path_field2');
        })->where('access.user_id', '=', $user_id);
    });
    

    ->where('access.user_id', '=', $user_id) 条件不必在 JOIN 闭包内。我只是把它放在那里以完全匹配您的查询。把它放在外面可以简化代码:

    DB::table('t')->join('access', function($query) {
        $query->on('t.field1', '=', 'access.field1')
            ->orOn('t.field2', '=', 'access.path_field2');
    })->where('access.user_id', '=', $user_id);
    

    【讨论】:

    • 谢谢。我错过了在连接回调中使用where 来指定一个值而不是一个列。我曾假设 where 会像第二个示例一样添加到 where 子句中。当然,在这个简单的示例中,您的 2 个有用示例的结果是相同的,但在某些情况下,on 中的条件会产生不同的效果。
    猜你喜欢
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 2020-10-19
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多