chelkaz
@chelkaz

Каким образом сделать связи между четырьмя и одним изначально не существующим объектом?

Добрый день, давольно для меня затруднительно понять.
Пример: Есть три таблицы, первая ученические классы, в ней хранятся классы, например:
id name
1 1А
2 7Д
3 3Б
Вторая ученики, например:
id name
1 Петя
2 Денис
3 Олег
Еще таблица учителей:
id name
1 Валентина
2 Елена
3 Анжела
В публичной части есть выпадающий список из классов, и простой список учеников.
Например залогинелась Валентина
Задача - она хочет выбрать класс, например 7Д и отметить учеников, что бы создать некую группу или добавить в уже существующую. А далее вот что важное!!!
Нужно создать некую группу у которой будет указан класс и выбранные ученики.
Если например выбран класс 7Д и мы пытаемся добавить учеников, то проверяем, если такой группы нет, то создаем, но если она есть то добавляем в нее. После этого, как создана хоть одна группа, появляется новый выпадающий список, из созданной группы и кнопка - "Создать группу" нажимая на которую, создается новая группа с активным классом.
Вот как лучше сделать связи из этих таблиц? И как лучше продумать структуру хранения?
  • Вопрос задан
  • 109 просмотров
Пригласить эксперта
Ответы на вопрос 2
@jazzus
Как бы не хотелось сейчас создать 3 таблицы для одинаковых сущностей – не делайте этого. Совет от новичка) Потом замучаетесь рефакторить, а рефакторить структуру бд – это все сносить и делать заново. И вы будете это делать. Потому что юзеры в разных таблицах принесут вам проблемы.

Нужно сделать модели (таблицы)
User (все пользователи)
Role (именование ролей – учителя, ученики и т.д.)
UserRole (с полями user_id и role_id)

User связывается с Role через ManyToMany
В модели user
public function roles()
    {
      return $this->belongsToMany('App\Role', 'user_roles', 'user_id', 'role_id');
    }

В модели Role

public function users() {
        return $this->belongsToMany('App\User', 'user_roles', 'role_id', 'user_id');
      }

Можно проще записать но лучше так. Теперь у вас есть связь между ролями и юзерами через промежуточную таблицу 'user_roles'. Почему именно так:
1) У вас будет одна таблица вместо 10 для любых изменений, связанных с пользователями. Например, добавить новое поле, изменить поле ит.д. Вы это будете делать 1 раз, а не 10, исключая ошибки человеческого фактора
2) Вы захотите добавить правила доступа. А для этого нужна будет еще одна таблица Perm. Которая будет привязана к ролям. И сделать это будет легко и просто в данной структуре и права доступа вы потом будете менять в несколько кликов.
3) С несколькими таблицами юзеров у вас будет запутанная раздутая логика со множеством моделей, переменными , вы замучаете ларавелю, запутаетесь сами и снесете все нафиг.

Ладно, модели создали)) Теперь при регистрации добавим роль пользователю. Допустим учитель регистрируется и выбрает себе роль учитель (пускай будет чекбокс с полем role где value это ид роли).

В контроллере регистрации (если стандартном ларавелевском) идете в метод
protected function create(array $data)

и пишете после создания юзера

$user->roles()->attach($data['role']);
После чего у вас автоматом создастся запись в промежуточной таблице и юзеру будет присвоена роль учителя. Готово. Теперь вы можете делать все что угодно.

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

$teachers = Role::find(3)->users()->get();
Правильно написал? только цифры нужно поменять на константы и вообще лушче сразу в модели написать один метод для получения юзеров любых ролей (подставлять название константы роли через переменную) – но это ладно, потом просто передалть. На этом все) Только после создания ролей можно приступать к группам и это уже нужно выносить в отдельный вопрос.
Ответ написан
@vism
Просто создаете таблицу
school_groups:
name
class_id
type_id(100% типы появятся)

school_group_users
school_group_id
user_id
user_object(если user может быть учитель или ученик)
admin_id
admin_object(если админ может быть учитель или ученик)
либо вместо admin_id и admin_object сделать поле access_type и ставить там типо доступа просто и все

Конечно можно делать через систему ролей и доступов, но это раз так в 100 будет трудозатратнее и дороже.
Ну и если вы задаете такой вопрос, вы нормально не сделаете, потому не лезьте в систему ролей.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы