我可以使用whereHas方法查询关系存在的位置,但现在我需要获得此结果的反函数,其中结果与whereHas子句中的结果不匹配。
这是我的疑问:
$query->whereHas('actions', function ($query) {
$query->where('actions.created_at', '>', Carbon::now()->addDays(-30));
});
这可以获取过去30天内执行的操作,但我需要获取过去30天内未执行操作的内容。
似乎我需要从关系中获取max(actions.created_at)并查看该值是否为> 30天前,但我不确定如何以雄辩的方式做到这一点。
注意:人与动作之间的关系是1到多,因此可能会链接多个动作记录,因此我不能只将操作符翻转为“< =”
答案 0 :(得分:9)
请记住whereHas
有两个以上的参数:
$query->whereHas('actions', function ($query) {
$query->where('actions.created_at', '>', Carbon::now()->addDays(-30));
}, '=',0);
事实上,它还有两个,但默认设置为'> ='和'1'。因此,我们添加参数'='和'0'(或'<',以及'1'以了解它的重要性),以便在子查询中对其进行转换,例如'所有不在动作子集中的动作超过30天)。
whereHas
方法:https://isocpp.org/wiki/faq/templates#separate-template-fn-defn-from-decl
答案 1 :(得分:0)
你能不能将你的where查询更改为小于或等于?
$query->whereHas('actions', function ($query) {
$query->where('actions.created_at', '<=', Carbon::now()->addDays(-30));
});
答案 2 :(得分:0)
试试这个[伪代码]:
$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();
看,如果有帮助。