【发布时间】:2021-10-21 07:41:20
【问题描述】:
我正在尝试从数据库中获取所有过期的列表。该表具有到期日期的三个字段,to_date_1、to_date_2、to_date_3。 date 2&3 可能有一个空值,但 date 1 总是有一个值。如果日期 3 不为空,我希望查询与日期 3 进行比较并跳过 date1 &2。如果日期 3 为空,则查询应与日期 2 进行比较,否则日期 1 将是到期日期。这是我的查询。
$query = Listing::query()
->where('vendor_id', $vendor->id)
->where('is_deleted', 0)->where('is_published', 1)->where('is_approved', 1)
->where(function ($q) {
return $q->WhereNotNull('to_date_3')->Where('to_date_3', '<', \Carbon\Carbon::now()->format('Y-m-d'));
})
->where(function ($q) {
return $q->WhereNotNull('to_date_2')->Where('to_date_2', '<', \Carbon\Carbon::now()->format('Y-m-d'));
})
->where(function ($q) {
return $q->orWhere('to_date_1', '<', \Carbon\Carbon::now()->format('Y-m-d'));
})
->orderBy('created_at', 'desc');
$listings = $query->paginate(10);
这是一个示例数据:
| id | from_date_1 | to_date_1 | from_date_2 | to_date_2 | from_date_3 | to_date_3 |
|---|---|---|---|---|---|---|
| 1 | 2021-06-10 | 2021-08-15 | 2021-08-16 | 2021-08-31 | 2021-09-01 | 2021-09-15 |
| 2 | 2021-06-25 | 2021-08-10 | 2021-08-11 | 2021-08-22 | NULL | NULL |
| 3 | 2021-06-25 | 2021-08-20 | NULL | NULL | NULL | NULL |
如果今天的日期是:21-08-2021,结果应该是记录:1 & 2
【问题讨论】:
-
你能查一下
->where(function ($q) { return $q->WhereNotNull('to_date_3')->Where('to_date_3', '<', \Carbon\Carbon::now()->format('Y-m-d')); })返回什么吗? -
我设法将完整的查询作为 sql 获取,从逻辑上讲这是不正确的,这就是它返回 null 的原因。我更新了我的帖子
-
尝试
->toSql()将您的查询检查为sql -
@PavloMezhevikin,是的,查询已经在帖子中,不知何故它正在工作,但结果还不是 100% 正确。
-
那是你想要的 SQL 吗?还是你从 Laravel 代码中得到的坏 SQL?
标签: laravel laravel-query-builder