【发布时间】:2020-01-11 08:45:13
【问题描述】:
我目前被困在一个 where Laravel 查询上。问题是,我想根据给定表中的最新记录过滤一些数据。目前,我的查询如下所示:
$clients = $clients->whereDoesntHave('bill')->orWhereHas('bill', function ($query) use ($activeSchoolYear){
$query
->where('created_at', '<', Carbon::parse($activeSchoolYear->start));
})
$activeSchoolYear->start 是今天的日期。
如果我的 bills 表中有多个记录,就会出现问题。例如,如果我有两条不同日期的记录:
ID | Name | created_at |
1 | test | 2019-09-09 15:31:25|
2 | test2 | 2018-09-10 16:42:44|
查询仍然返回两个日期,即使其中一个为假。我认为该查询会查找数据库中的所有记录,并且仍然返回给定的用户,因为其中一个日期是正确的。我的问题是,是否可以仅针对数据库中的最新行。或者这不能使用 eloquent 来完成。任何帮助表示赞赏。
编辑:
正如@Caddy 建议的那样,我使用了查询范围,但我对其进行了一些修改:
public function scopeNoActiveBill($query){
return $query
->groupBy('created_at')->take(1)
->where('created_at', '<=', Carbon::create(2019, 9, 1));
}
我试图只从 bills 表中取出最后一行。然后,在控制器内部,这是我的查询:
$clients = $clients->whereDoesntHave('bill')
->orWhereHas('bill', function ($query) use ($activeSchoolYear){
$query->noActiveBill();
})
->whereHas('contracts', function ($query) use ($request) {
$query
->where('contract_type', '<', 2)
->where('signed', 1)
->where('school_year_id', $request['school_year']);
});
因此,我希望既没有任何账单的客户,也希望有符合给定标准的账单的客户。如果客户只有一张账单,该查询可以正常工作,但问题是当客户有多个账单时。如果这些账单中的任何一个符合给定范围,它就会返回该账单。我只想检查最新的记录,如果该记录符合范围条件,则退回帐单。
编辑 2:
感谢@Caddy DZ 的asnwer,我设法得到了想要的结果。我只是更改了条件以监视在给定日期之前没有创建账单的客户。查询范围:
public function scopeNoActiveBill($query){
return $query->where('created_at', '>=', Carbon::create(2019, 9, 1));
}
控制器:
$clients = $clients->whereDoesntHave('bill')
->orWhereDoesntHave('bill', function ($query) use ($activeSchoolYear){
$query->noActiveBill();
});
【问题讨论】:
-
目前您只过滤
clients而不是bills,为什么您希望只收到一张账单?你从哪里收到多张账单?当你打电话给$client->bills?您可以使用$client->bills()->latest()->first();获取客户的最新账单。 -
我试图从用户那里获得相关的账单。我不能只使用
latest()->first(),因为我预计会有大约 203 个结果。