我正在使用Laravel 5.3.30并面临当前的问题。我试图到处搜索,没有找到任何相关的解决方案,我真正需要的。所以在将此标记为重复之前请务必仔细阅读我的问题。
表: [客户],[消息]
关系客户有很多消息
我想要实现的目标是: 从现在开始,所有客户的最后一条消息(contact_date)都不到一周。
我做了很多事情,包括以下内容:
Client::whereHas('messages', function($query){
$query->orderBy('contact_date', 'desc')
->whereDate('contact_date', '<', Carbon::now()->subDays(7));
})->get();
这是我现在告诉的最佳选择,但它不能满足我的需求。
这将检查客户端的所有(contact_date),并将检索消息少于所需日期的任何客户端。
我的问题是: 我如何才能将其应用于最新的[消息]记录?假设每个客户端有100条消息,并且只想在最新消息上应用它。因此,如果不满足消息条件,查询将不会检索客户端。
答案 0 :(得分:1)
看起来您需要执行子查询才能仅加入早于指定日期的日期:
Client::select('clients.*')
->join(DB::raw('(SELECT messages.* FROM messages WHERE contact_date < {$date})'), function($join)
{
$join->on('clients.id', '=', 'messages.client_id');
})
->groupBy('messages.client_id')
->orderBy('contact_date', 'desc')
->get();
我不确定此代码是否会完美运行,但它应该让您了解如何执行此操作。
答案 1 :(得分:0)
您应该在条件中使用>
:
whereDate('contact_date', '>', Carbon::now()->subDays(7));
完整代码:
Client::whereHas('messages', function($query){
$query->orderBy('contact_date', 'desc')
->whereDate('contact_date', '>', Carbon::now()->subDays(7));
})->get();