gpt4 book ai didi

mysql - Laravel eloquent - 多对多,单个数据透视表上的多个 "roles"

转载 作者:行者123 更新时间:2023-11-29 11:28:06 24 4
gpt4 key购买 nike

我有两个模型 UserBusinesses

企业可以拥有许多用户,企业也可以拥有许多用户。

例如:

  • John 是 Business1 的管理员。
  • John 是 Business2 的 super 管理员。
  • Mike 是 Business1 的客户。
  • Mike 是 Business1 的订阅者。

连接这些并稍后查询它们的最佳方式是什么。

我构建了一个数据透视表 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

最佳答案

您的解决方案工作正常,但为了稍后实现更多灵 active (添加更多角色,定义更多与角色的关系,例如权限等),您可以考虑以下内容(注意,这也引入了一些复杂性,因此请考虑您是否需要这种灵 active )。

为关系创建专用模型 (RoleAssignment),并为不同角色创建一个模型 (Role)。然后,RoleAssignment 具有三个 belongsTo 关系,即 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');

关于mysql - Laravel eloquent - 多对多,单个数据透视表上的多个 "roles",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37864264/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com