Laravel: получить модели, если для количества отношений есть какое-либо условие - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть User и UserComplains Models. Мне нравится получать пользователей, у которых UserComplains более 2 раз за последние 24 часа.

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

приведенный выше код хорошо и работает, но мне интересно, есть ли лучший способ сделать это?!

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Вы можете сделать следующее:

User::whereHas('complaints', function($query) {
   $query->where('created_at', '>=', '2020-04-26');
}, '>', 2)->get();

Для того, чтобы это работало, вам необходимо установить отношения между моделями User и UserComplaint.

class User extends Model
{
    public function complaints()
    {
        return $this->hasMany(UserComplaint:class);
    }
}
1 голос
/ 27 апреля 2020

Для чего-то подобного вы можете использовать whereHas () . :

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

Как упомянуто в документации , вы можете передать дополнительные проверки в качестве 3-го и 4-го параметров, поэтому в этом случае вы хотите указать, где у пользователя более 2 user_complains.

NB Вам необходимо заменить *relationship* на фактическое имя отношения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...