@kakaduwka

Создание связных записей Laravel Eloquent?

Здравствуйте, возник вопрос как создавать связные записи в Laravel ,допустим есть 3 таблицы User,Role и Profile, в запросе на создание приходят данные для этих таблиц,например {data:{user[],role:[],profile}}, поля role и profile могут быть пустыми, есть специальный сервис для юзера c методом create, так вот будет ли верным прям в этом методе делать проверки на пустоту этих полей и создавать записи role и profile с привязкой по id к юзеру, как правильно разделить эту логику в рамках laravel, создать отдельные сервисы для role и user и тогда уже вызывать у них методы create

Буду сильно благодарен, если приведете примеры кода или псевдокода
  • Вопрос задан
  • 141 просмотр
Пригласить эксперта
Ответы на вопрос 2
delphinpro
@delphinpro Куратор тега Laravel
frontend developer
Какие связи-то?

Допустим юзер-роль - это many-to-many

class User {
  public function roles(): BelongsToMany {
    return $this->belongsToMany(Role::class);
  }
}
class Role {
  public function users(): BelongsToMany {
    return $this->belongsToMany(User::class);
  }
}


Набор ролей, как правило фиксированный, или заполняется в админке.
И роль юзеру просто назначается.

$user = User::create([...]);
$user->roles()->attach(Role::whereSlug('user')->firstOrFail());


Не знаю, какое у вас отношение между профилем и пользователем.
Но примерно так

$user->profiles()->create([
]);
Ответ написан
Комментировать
@Holmess88
Нет правильного ответа, есть наилучшее подобранное решение к каждому индивидуальному кейсу)

С точки зрения разделения сервисов по обязанностям правильнее было бы делать на каждый экшен свой сервис.
Допустим у нас есть инфраструктурный класс-контроллер(не обязательно контроллер в нашем понимании), который всё что делает это поручает работу другим классам и не содержит бизнес-логики.

Я бы в таком классе-контроллере поручил сервису пользователей создать пользователя.
Сервису ролей передать созданного пользователя и от него сделать $user->create(attributes) Только заранее дайте им fillable поля в модели, иначе атрибуты сами не заполнят модель.
По той же схеме создаем профиль.

Таким образом инфраструктурный класс не взял на себя никакой логики и все сервисы остались чистыми по входящим зависимостям. Валидируем в форм реквесте лары.

Таскать по сервисам модели не обязательно, можно сделать CreateUserDto. Но тогда из лары мы начинаем делать симфони.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы