Laravel 4:左边连接where子句没有显示任何链接的行

时间:2014-04-24 13:05:17

标签: laravel-4 left-join

我正在尝试在Laravel 4中建立一个Artisan Cron Job,它可以让我们所有的订户都能使用Eloquent ORM付费。我正在努力实现这一点,我让所有用户订阅了至少一个月前最后一次付款的用户,或者根本没有付款的新订阅者。 然而,我只从用户表(用户1和3)获取信息,付款表的值为“空”'。这意味着他们不在范围内,但我只想要' null'如果他们在表格付款中没有任何值,则会显示值。

我的代码:

$Payments = user::leftJoin('payments', function ($query) {
     $query->on ('payments.user_id', '=', 'user.id')
        ->where ('payments.paid_on', '<=', 
            date('Y-m-d H:i:s',mktime(0, 0, 0, date("m")-1, date("d"),   date("Y"))))
        ->where ('payments.paid_on', '>=', 
            date('Y-m-d H:i:s',mktime(0, 0, 0, date("m")-1, date("d")-10, date("Y"))));
   })
  ->where('user.start', '<', date('Y-m-d H:i:s',time()) )
  ->where('user.end', '>', date('Y-m-d H:i:s',time()) )
   ->get(['user.*','payments.paid_on']);

这是示例数据:

(user)
 id    start                 end
| 1 | 2014-02-24 00:00:00 | 2015-02-24 00:00:00 |
| 2 | 2012-03-24 00:00:00 | 2013-01-24 00:00:00 |
| 3 | 2014-03-24 00:00:00 | 2015-03-24 00:00:00 |

(payments)
user_id   paid_on
| 1    | 2014-02-24 00:00:00 |
| 1    | 2014-03-24 00:00:00 |
| 2    | 2013-01-24 00:00:00 |

我希望它会出类似的东西:

| 1 | 2014-02-24 00:00:00 | 2015-02-24 00:00:00 | 1    | 2014-03-24 00:00:00 |
| 3 | 2014-03-24 00:00:00 | 2015-03-24 00:00:00 |

1 个答案:

答案 0 :(得分:0)

我不知道我是否得出了正确的结论,但这就是我最终的结果。检查where子句中右表中是否存在值,如果没有检查是否存在NULL值。这是代码:

$Payments = user::leftJoin('payments', 'user.id', '=', 'payments.user_id')
  ->where('user.start', '<', date('Y-m-d H:i:s',time()) )
  ->where('user.end', '>', date('Y-m-d H:i:s',time()) )
  ->where (function($query)
  {
     $query->where ('payments.paid_on', '<=', 
        date('Y-m-d H:i:s',mktime(0, 0, 0, date("m")-1, date("d"),   date("Y"))))
      ->where ('payments.paid_on', '>=', 
        date('Y-m-d H:i:s',mktime(0, 0, 0, date("m")-1, date("d")-5, date("Y"))))
      ->orWhere(function($orQuery)
      {
         $orQuery->whereNull ('payments.paid');
      });

  }
  ->get(['user.*','payments.paid_on']);