Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 22.10.2018 16:50:24

Создание и обновление наследников пользователей

Здравствуйте.
Если есть похожие темы, статьи, решения, отправьте меня туда. Спасибо.

Нужно создавать и изменять пользователей: клиентов, сотрудников

Есть таблица пользователей, в ней общие данные: имя, телефон почта.
Они ничего не знает о дочерних таблицах(нет полей с типом пользователя)
1. Таблица users: name, sername, phone, email, password, city_id

Таблицы клиентов и сотрудников наследуют таблицу пользователей по полю user_id, в отношении 1 к 1.
2. Таблица clients: activation, request_count, user_id...
3. Таблица staff: position_id, office_id, user_id...

Есть 3 модели с ресурс-контроллерами.
User. В ней есть fillable, sortable, dates и отношения к другим таблицам(client - данные о клиенте по user.id, staff - данные о сотруднике по user.id, city - город по полю city_id,  ...)
Client. Есть свои fillable, sortable, отношения к таблицам (user - 1 к 1, status ...)
Staff. Есть свои fillable, sortable, отношения к таблицам (user - 1 к 1, office ...)

Для валидации есть ClientRequest, StaffRequest. Они расширяют правила UserRequest.

Сейчас у меня все работает так:
Создать клиента - роут /clients/store. В контроллере приходится вызывать сначала $this->user->create(request), затем $this->client->create(request).
Создать сотрудника - заменить на staff
Думаю, что за это должна делать модель и контроллер User. Но тогда в контроллере надо делать проверку, кого создаем/изменяем и использовать разные реквесты(Если делать через условие). Либо создавать кастомные методы (CreateUser / CreateClient).
Как она будет узнавать кого создавать? 1. По роуту. Тогда надо писать кастом роут в дополнение к route::resource 2. Делать проверку в контроллере.

Вопрос1: Как правильно?
Вопрос2: Как правильно создавать записи вместе с отношением в одну строку? Что-то вроде CLient::with('user')->create(request) и он заполнит 2
таблицы?

-------
Обновляю записи так же, как создаю, но  методом update. В две строки. Сначала user, затем client.
Мне кто-то говорил, что лара умная и можно обойтись $model->save($data). Но у меня не выходит.

Вопрос3: как легко обновить модель и ее отношение с помощью request->all()


-------
Я использую laravel Collective для форм. При создании формы с моделью, часть данных не подставляется, потому что есть связь. Приходится ручками прописывать client->user->name.

Вопрос4: есть способы подставлять поля формы вместе со связью?

--------
Вопрос5: В правильном ли направлении я двигаюсь? Нужно ли наследовать таблицу? Как делаете вы?

Не в сети

#2 23.10.2018 08:27:27

Re: Создание и обновление наследников пользователей

не предендую на экспертное мнение, просто поделюсь своим видением:

1. не бывает в программировании единственно правильного решения. делайте так, чтобы работало. ниже я напишу рабочий вариант.

2. "в одну строку" будет если вы создадите свой класс или функцию-хелпер, который/-ая прячет внутри себя чуть более сложные операции. сейчас ценится не экономия букв, а легкость в сопровождении.

3. похоже опять про "в одну строку" — совет тот же — делайте обёртку, которая будет прятать сложность реализации внутри себя.

4. конструкторы форм существуют, возможно кто-то так умеет, я не интересовался т.к. считаю это ненужной сложностью.

5. нет, я так не думаю. то, о чём вы пишете реализуется через полиморфные отношения, а не через наследование от класса User. попробуйте так, если интересно.


вообще сомневаюсь что на базе ActiveRecord можно получить полноценный ORM. это будет борьба с трудностями и непонятно с какой целью.

советую думать о разных пользователях как о носителях разных ролей, а не как о разных типах данных. это проще и гибче, т.к. допускается "множественность" ролей и не требуется хардкодить smile
пользователю может быть назначена роль "клиент" или "сотрудник" или "руководитель отдела маркетинга" или несколько ролей сразу. что касается разного набора полей для разных пользователей — можно создать полный набор в таблице users. ну не будут они все использоваться, не беда.

Google: laravel best rbac components

Изменено artoodetoo (23.10.2018 08:50:53)


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

Подвал раздела