我想创建一个这样的查询。
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方法,并且不支持将闭包作为参数传递。还有其他建议吗?
答案 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处理查询的唯一方法,它基本上完全相同。