Laravel搜索不存在关系的地方

时间:2015-12-03 12:31:09

标签: php laravel eloquent

我可以使用whereHas方法查询关系存在的位置,但现在我需要获得此结果的反函数,其中结果与whereHas子句中的结果不匹配。

这是我的疑问:

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

这可以获取过去30天内执行的操作,但我需要获取过去30天内未执行操作的内容。

似乎我需要从关系中获取max(actions.created_at)并查看该值是否为> 30天前,但我不确定如何以雄辩的方式做到这一点。

注意:人与动作之间的关系是1到多,因此可能会链接多个动作记录,因此我不能只将操作符翻转为“< =”

3 个答案:

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

看,如果有帮助。