Laravel过滤器模型(按相关模型计数)

时间:2018-08-28 11:09:58

标签: laravel laravel-5 pagination eloquent relationship

我有一个有用户组的列表。网上论坛的属性为maximum_users。用户只有在有空位的情况下才能在组中注册(如果该组中注册用户的数量不超过该组的maximum_users属性)。

  • 如何仅选择具有免费位置的用户可以注册的网上论坛?
  • 我需要对结果进行分页。

在符合以下条件的情况下,我可以过滤组:

$group->maximum_users >= $group->users()->count()

但是在这种情况下分页不起作用。

表结构:

groups
    id - integer
    maximum_users - integer

users
    id - integer
    group_id - integer

型号:

class Group extends Model
{
    public function users()
    {
        return $this->hasMany('App\Models\User');
    }
}


class User extends Model
{
    public function group()
    {
        return $this->belongsTo('App\Models\Group');
    }
}

1 个答案:

答案 0 :(得分:1)

  

如何仅选择具有免费位置的用户可以注册的组?   我需要对结果进行分页。

我强烈建议您使用数据透视表,除非用户只能在一个组中,并且数据透视表应如下所示:

Group::whereRaw('(SELECT COUNT(*) 
                  FROM groups_users 
                  WHERE group_id = group.id) < group.maximum_users')
    ->paginate(15);

采用当前结构

Group::whereRaw('(SELECT COUNT(*) 
                  FROM users 
                  WHERE group_id = groups.id) < groups.maximum_users')
    ->paginate(15);
相关问题