只有在laravel elequent

时间:2017-03-15 15:21:40

标签: laravel laravel-query-builder

我正在使用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条消息,并且只想在最新消息上应用它。因此,如果不满足消息条件,查询将不会检索客户端。

2 个答案:

答案 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();