2017-03-15 67 views
0

我正在使用Laravel 5.3.30并面临当前的问题。我试图到处搜索,并没有找到任何相关解决方案来满足我的需求。因此,请在将此标记为重复之前仔细阅读我的问题。只有在急速加载条件满足laravel ennial时才获取记录

表: [客户],[消息]

关系:客户有许多消息

我想要实现的是: 让所有的客户谁他最后的消息(contact_date)距离现在还不到一周。

我试了很多事情,包括以下内容:

Client::whereHas('messages', function($query){ 
    $query->orderBy('contact_date', 'desc') 
    ->whereDate('contact_date', '<', Carbon::now()->subDays(7)); 
})->get(); 

这是我现在告诉最好的选择,但它不能满足我的需求。

这将检查客户端的所有(contact_date),并将检索消息少于所需日期的任何客户端。

我的问题是: 我如何才能将这只适用于最新的[消息]记录?假设每个客户端都有100条消息,并且只想将其应用于最新消息。所以,如果消息条件不符合,查询将不会检索客户端。

+0

一个GROUPBY由ACCOUNT_ID分组消息? –

+0

@chasenyc你的意思是client_id,是的,尽管他的最后一条消息大于约束条件中设置的日期,但我还是试着让它仍然得到客户端,而不是因为客户端有其他消息少于那个日期。或者,也许我做错了,请你说明一下。 – ClearBoth

回答

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

我不知道该代码将很好地工作如同但它应该给你怎样的想法去做吧。

+0

不幸的是,子查询连接也会得到与检查消息的较早日期相同的结果。我只想要每个客户的最新消息。 Client :: select('clients。*') - > join(DB :: raw('(SELECT messages。* FROM messages WHERE contact_date <“'。Carbon :: now() - > subDays(7)。'”)作为SubQuery'),函数($ join){$ join-> on('clients.id','=','SubQuery.client_id');}) - > groupBy('SubQuery.client_id') - > orderBy 'contact_date','desc') - > get();我也尝试了不同的子查询,但结果相同。感谢您的帮助 – ClearBoth

+0

我设法使它与子查询一起工作!谢谢 – ClearBoth

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(); 
+0

我需要的日期少于不超过指定日期 – ClearBoth