首页 > 解决方案 > Laravel 枢纽咨询

问题描述

我需要关于我的模特关系的建议,

逻辑

  1. Group有很多users
  2. Group有很多admins
  3. User有很多groups(作为用户)
  4. User有很多groups(作为管理员)

数据库结构

  1. 组表
  2. 用户表
  3. Group_Users 表(保存用户 ID 和组 ID)
  4. Group_Admins 表(保存用户 ID 和组 ID)

关系代码

User model

public function groupsUser() {
    return $this->hasMany(GroupUser::class);
}

public function groupsAdmin() {
    return $this->hasMany(GroupAdmin::class);
}

Group model

public function users() {
    return $this->hasMany(GroupUser::class);
}

public function admins() {
    return $this->hasMany(GroupAdmin::class);
}

GroupUser model

public function group() {
    return $this->belongsTo(Group::class);
}

public function user() {
    return $this->belongsTo(User::class);
}

GroupAdmin model

public function group() {
    return $this->belongsTo(Group::class);
}

public function user() {
    return $this->belongsTo(User::class);
}

把招工广告

users基本上,由于和之间的关系groups多对多的,通常我不需要模型,GroupUser然后GroupAdmin只使用sync()函数来从这些表中添加/删除用户和组 ID。

那我有什么顾虑?

通常,当我想将批量 ID 输入到数据库中时(比如说向帖子添加标签,突然将 10 个标签 ID 与 1 个帖子相关联),我使用这种类型的连接,使用和删除模型的那一刻是sync()有意义的,但在我的情况下,当用户加入/添加时一组一组,你对这种关系有什么建议?GroupUserGroupAdmin

  1. 我目前的方法有意义吗?
  2. 如果我删除这些GroupUserGroupAdmin模型并将它们添加到user, group模型中会更好:
public function users()
{
    return $this->hasMany(User::class, 'group_users', 'user_id', 'id');
}

等等?

你认为最好的做法是什么?

标签: phplaravel

解决方案


用户和组是多对多的

你的桌子是这样的吗?

users, user_group, groups?

使用“belongsToMany”关系怎么样? Laravel 多对多关系

// User model

public function groups() {
    return $this->belognsToMany(Group::class);
}
// Group model

public function users() {
    return $this->belognsToMany(User::class);
}

并使用喜欢。

User::find(1)->groups; // return user 1 groups
User::find(1)->groups()->sync($groupIds); // relate user and groups

Group::find(1)->users; // return group 1 users

如果您的用户表中有角色列,则可以冷添加关系。

// Group model

public function users() {
    return $this->belognsToMany(User::class)->where('role', 'the role of normal user');
}

public function admins() {
    return $this->belognsToMany(User::class)->where('role', 'the role of admin user');
}

希望它可以帮助你。


推荐阅读