Laravel сводная консультация - PullRequest
0 голосов
/ 09 мая 2020

Мне нужен совет о моих модельных отношениях,

Logi c

  1. Group много users
  2. Group много admins
  3. User имеет много groups (как пользователь)
  4. User имеет много groups (как администратор)

Структура базы данных

  1. Таблица групп
  2. Таблица пользователей
  3. Таблица Group_Users (сохранить идентификатор пользователя и идентификатор группы)
  4. Таблица Group_Admins (сохранить идентификатор пользователя и 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() для добавления / удаления пользователей и идентификаторов групп из этих таблиц.

Что меня беспокоит тогда ?

Обычно я использую этот тип подключения, когда мне нужен объемный ввод идентификаторов в базу данных (скажем, добавление тегов к сообщениям, внезапное связывание идентификаторов 10 тегов с 1 сообщением) в этот момент с использованием sync() и удалением моделей GroupUser и GroupAdmin имеет смысл, но в моем случае, когда пользователи присоединяются / добавляют в группы один по одному, что вы предлагаете для этих отношений?

  1. Имеет ли мой текущий подход смысл?
  2. Лучше, если я удалю эти GroupUser и GroupAdmin моделей и добавьте их в user, group модели, например:
public function users()
{
    return $this->hasMany(User::class, 'group_users', 'user_id', 'id');
}

и так далее?

Как вы думаете, что лучше всего?

1 Ответ

0 голосов
/ 09 мая 2020

пользователей и групп много ко многим

ваши таблицы любят это?

users, user_group, groups?

Как насчет использования отношения «принадлежит ко многим»? 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');
}

Надеюсь, это вам поможет.

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