【问题标题】:Advanced join with AND, OR and IS NULL - Laravel使用 AND、OR 和 IS NULL 进行高级连接 - Laravel
【发布时间】:2014-09-28 20:28:09
【问题描述】:

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

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 方法,也不支持将闭包作为参数传递。还有其他建议吗?

【问题讨论】:

  • 你在laravel.com/api/4.2/Illuminate/Database/Query/JoinClause.html这里签到了吗?我不知道 lavarel,但是看着这个页面,在我看来它有你的答案。里面有一个 whereNull (laravel.com/api/4.2/Illuminate/Database/Query/…)。
  • 我现在试了一下,它给了我一个Call to undefined method Illuminate\Database\Query\JoinClause::whereNull()。我们使用的是 4.1,也许它是在 4.2 中添加的?
  • 无论如何,谢谢,升级的激励措施......不过,另一个主要问题仍然存在。
  • 对。作为替代方案,您可以只重新编写 SQL。您可以对匹配的 id 进行内部连接,并将其余条件放在 where 子句中。不过,我不确定这会对您的申请产生多大影响。

标签: php mysql sql laravel laravel-4


【解决方案1】:

您无法使用 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 处理您的查询的唯一方法,而且基本上是完全一样的。

【讨论】:

  • 我实际上很快就尝试过了,但它没有返回任何结果,所以我认为我必须在 join 子句中这样做。在您回答之后,我尝试了更多,在将 OR 查询更改为 orWhere('user.year_from', '&gt;', DB::raw('course.year_from')) 后,它开始工作。这是预期的行为吗?
  • 好吧,我的错。当然这是预期的行为。马上换答案。 where 中的 2nd/3rd 参数是绑定的,所以它基本上被视为字符串输入,而不是表字段。这就是为什么您需要为此使用raw
猜你喜欢
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 2014-12-08
  • 2013-06-04
相关资源
最近更新 更多