首页 > 解决方案 > Laravel:如果关系计数有某些条件,则获取模型

问题描述

我有用户和用户投诉模型。我喜欢检索在过去 24 小时内用户投诉次数超过 2 次的用户。

users:
id

user_complains:
complained_id ->ref-> users.id
created_at

这是我尝试过的,它正在工作:

$users = User::select('users.*')->join('user_complains' , 'users.id' , '=' , 'user_complains.complained_id')
        ->whereRaw("(
        select count(*) from `user_complains`
        where `user_complains`.`complained_id` = `users`.`id`
        and `user_complains`.`created_at` > ?) >= ?" , [now()->subHours(24), 2])
        ->groupBy("users.id")
        ->get();

上面的代码很好并且正在工作,但我想知道有没有更好的方法来做到这一点?!

标签: mysqllaravel

解决方案


对于这样的事情,您可以使用whereHas()。:

$users = User::whereHas('*relationship*', function ($query) {
    $query->where('created_at', '>=', now()->subDay(1));
}, '>', 2)->get();

文档中所述,您可以将附加检查作为第 3 和第 4 参数传递,因此在这种情况下,您想说明用户在哪里拥有超过 2 的参数user_complains

NB您将需要替换*relationship*为关系的实际名称。


推荐阅读