@NikHaker
/

Как хранить дополнительные данные о модели в Laravel?

Приветствую. Использую RBAC подход на основе laravel + фреймворк laratrust. Роль можно выдавать различным моделям пользователей. У каждой роли у меня есть тип (просто число), определяющий, к каким моделям можно применить эту роль. Например, тип ролей "Роль пользователя" можно выдать только моделям App\User. Вопрос в следующем: мне нужно хранить некую дополнительную информацию о ролях. Причем структура этой информации зависит от типа роли. Например, в ролях с типом "Роль пользователя" мне нужно хранить еще поле "is_super_user", а в ролях с типом "Роль чата" мне нужно хранить совсем другой набор полей. Как это можно правильно сделать?
Рассматривал такие варианты:
- сделать просто поле data у роли, которое в json хранит всю информацию. Просто, но не очень красиво, нельзя будет делать всякие выборки, поиски по доп. информации, и т. д.
- сделать динамическую hasOne связь. То есть как-то так:
public function data()
{
    switch ($this->role_type) {
        case 1: return $this->hasOne('App\UserRoleDataModel');
        case 2: return $this->hasOne('App\ChatRoleDataModel');
    }
}

Минусы подхода в том, что нужно завести еще кучу моделей просто для хранения дополнительной информации о роли. Ну и вообще, чуток странновато выглядит..

Что вы можете посоветовать по этой ситуации? Буду рад услышать ваши предложения.
  • Вопрос задан
  • 365 просмотров
Пригласить эксперта
Ответы на вопрос 1
@float64
Для хранения метаданных в Laravel есть специальный плагин: https://github.com/jarektkaczyk/eloquence/wiki/Metable

Пользуюсь, работает отлично.
Найденные опытным путем недостатки:
1) все значения метаданных будут хранится как string
2) аккуратнее с булевскими переменными в метаданных. Если вы храните false в мета-свойстве то $model->hasMeta('somefield') тоже вернет false.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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