Laravel搜索不存在关系的地方


Laravel search where relationship does not exist

我可以通过使用whereHas方法查询关系存在的位置,但现在我需要得到这个结果的倒数,其中结果与where Has子句中的结果不匹配。

这是我的问题:

$query->whereHas('actions', function ($query) {
    $query->where('actions.created_at', '>', Carbon::now()->addDays(-30));
});

这得到了过去30天内采取的措施,但我需要得到过去30天未采取的措施。

我似乎需要从关系中获得最大值(actions.created_at),看看这个值是否在30天前,但我不确定如何用雄辩来做到这一点。

注意:人和动作之间的关系是1对多,所以可能有多个动作记录链接,所以我不能只将运算符翻转为"<="

记住whereHas两个以上的参数:

$query->whereHas('actions', function ($query) {
    $query->where('actions.created_at', '>', Carbon::now()->addDays(-30));
}, '=',0);

事实上,它还有两个,但默认情况下设置为">="answers"1"。因此,我们添加了参数"="answers"0"(或"<",以及"1"),以在子查询中转换它,如"不在30天内添加的操作子集中的所有操作"。

whereHas方法:http://laravel.com/api/4.1/Illuminate/Database/Eloquent/Builder.html#method_whereHas

难道不能将where查询更改为小于或等于吗?

$query->whereHas('actions', function ($query) {
    $query->where('actions.created_at', '<=', Carbon::now()->addDays(-30));
});

试试这个[伪代码]:

$actions = App'Models'Action::all();
foreach($actions as $actionArray){
    $actionCreatedAt = new Carbon($actionArray->created_at);
    $now = Carbon::now();
    $difference = $actionCreatedAt->diff($now)->days;
    if($difference>30){
       $exceedingThirty[] = $actionArray;
    } else {
       continue;
    }
}

然后,您可以在视图中使用$exceedingThirty数组。

试试这个:

$sql = "DATEDIFF(actions.created_at, '".date('Y-m-d')."' ) > ". 30;
return App'Models'Action::whereRaw( $sql )->get();

看看,如果有帮助的话。