Laravel manyToMany, sigle pivot table 上的多个"roles"



我有两种型号UserBusinesses

业务可以有很多用户,而且业务也可以拥有许多用户。

例如:

  • John是Business1的管理员。
  • John是Business2的超级ADMIN。
  • Mike是Business1的客户。
  • Mike是Business 1的订户1。

以后将它们连接并查询它们的最佳方法是什么。

我构建了一个枢轴表business_user并添加了枢轴列

        $table->boolean('superadmin')->default(false);
        $table->boolean('admin')->default(false);
        $table->boolean('customer')->default(false);
        $table->boolean('subscriber')->default(false);

这是要走的方式,还是我应该做不同的事情?唯一出现的另一件事是与关系类型的每种类型的枢轴表不同,但这似乎是一个坏主意。

我会将其查询为:

      $user->businesses()->wherePivot('subscriber',true)->get();

我希望我不会在任何地方错过语法,但是如果我这样做,请因为别人而纠正我。

也有Redis作为下一步。

您的解决方案效果很好,但是以后启用更多弹性(添加更多角色,定义更多的关系,例如权限等),您可以考虑以下内容(注意,这也引入了一些复杂性,因此请考虑是否需要此灵活性)。

为关系创建专用模型(RoleAssignment),并具有不同角色(Role)的模型。然后,roleassignment具有三个belongsTo关系,to RoleUserBusiness

class RoleAssignment extends Model {
    public function role() {
        return $this->belongsTo(Role::class);
    }
    public function user() {
        return $this->belongsTo(User::class);
    }
    public function business() {
        return $this->belongsTo(Business::class);
    }
}
class Role extends Model {
    public function roleAssignments() {
        return $this->hasMany(RoleAssignment::class);
    }
}
class User extends Model {
    public function roleAssignments() {
        return $this->hasMany(RoleAssignment::class);
    }
    public function businesses($roleName = null) {
        return $this->hasManyThrough(Business::class, RoleAssignment::class)->where('name';
    }
}
class Business extends Model {
    public function roleAssignments() {
        return $this->hasMany(RoleAssignment::class);
    }
}

您给出的查询可以写为:

$user->roleAssignments()->whereHas('role', function ($query) {
    return $query->where('name', 'subscriber');
})->with('business')->get()->pluck('business');

为了简化这一点,您可以在User模型上修改roleAssignments的关系以接受可选的角色名称:

class User extends Model {
    public function roleAssignments($roleName = null) {
        $relation = $this->hasMany(RoleAssignment::class);
        if ($relation) {
            $relation->whereHas('role', function ($query) {
                return $query->where('name', 'subscriber');
            });
        }
        return $relation;
    }
}

现在您可以编写此查询:

$user->roleAssignments('subscriber')->with('business')->get()->pluck('business');

最新更新