首页 文章

Laravel搜索不存在关系的地方

提问于
浏览
5

我可以使用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 回答

  • 9

    记住 whereHas 有两个以上的参数:

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

    事实上,它还有两个,但默认设置为'> ='和'1' . 因此,我们添加参数'='和'0'(或'<',以及它重要的'1'),以便在子查询中对其进行转换,例如'不包含在少于0的操作子集中的所有操作30天) .

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

  • 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 数组 .

    OR

    试试这个:

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

    看,如果这有帮助 .

  • 0

    你能不能把你的查询地址改为小于或等于?

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

相关问题