Laravel 查询构建器与原始 ON 表达式连接

Laravel query builder join with raw ON expression

我正在尝试在 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 的查询生成器实现这一点?

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