使用AND,OR和IS NULL进行高级连接 - Laravel

时间:2014-08-06 02:23:13

标签: php mysql sql laravel laravel-4

我想创建一个这样的查询。

SELECT *
FROM user
INNER JOIN course ON user.course_id = course.id
AND (user.year_from IS NULL OR course.year_from > course.year_from)
AND (user.year_to IS NULL OR course.year_to < course.year_to)

我的第一个问题是我不知道如何翻译IS NULL部分。它甚至可能吗?第二个问题是如何使括号正确。我的第一个想法是做类似于高级where子句的事情。

$query->join('course', function($join) {
    $join->on(function($join) {
        $join->onNull('user.year_from')->orOn('user.year_from', '>', 'course.year_from');
    };
    $join->on(function($join) {
        $join->onNull('user.year_to')->orOn('user.year_to', '<', 'course.year_to');
    };
});

但是JoinClouse类没有onNull方法,并且不支持将闭包作为参数传递。还有其他建议吗?

1 个答案:

答案 0 :(得分:4)

你不能用Laravel方法创建那个确切的查询(当然,除非使用raw)。

以下是您需要的内容:

$query->join('course', 'user.course_id', '=', 'course.id')
  ->where(function ($q) {
    $q->whereNull('user.year_from')->orWhere('user.year_from', '>', DB::raw('course.year_from'));
  })
  ->where(function ($q) {
    $q->whereNull('user.year_to')->orWhere('user.year_to', '<', DB::raw('course.year_to'));
  });

这是Laravel处理查询的唯一方法,它基本上完全相同。