Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Здравствуйте.
Если есть похожие темы, статьи, решения, отправьте меня туда. Спасибо.
Нужно создавать и изменять пользователей: клиентов, сотрудников
Есть таблица пользователей, в ней общие данные: имя, телефон почта.
Они ничего не знает о дочерних таблицах(нет полей с типом пользователя)
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: В правильном ли направлении я двигаюсь? Нужно ли наследовать таблицу? Как делаете вы?
Не в сети
не предендую на экспертное мнение, просто поделюсь своим видением:
1. не бывает в программировании единственно правильного решения. делайте так, чтобы работало. ниже я напишу рабочий вариант.
2. "в одну строку" будет если вы создадите свой класс или функцию-хелпер, который/-ая прячет внутри себя чуть более сложные операции. сейчас ценится не экономия букв, а легкость в сопровождении.
3. похоже опять про "в одну строку" — совет тот же — делайте обёртку, которая будет прятать сложность реализации внутри себя.
4. конструкторы форм существуют, возможно кто-то так умеет, я не интересовался т.к. считаю это ненужной сложностью.
5. нет, я так не думаю. то, о чём вы пишете реализуется через полиморфные отношения, а не через наследование от класса User. попробуйте так, если интересно.
вообще сомневаюсь что на базе ActiveRecord можно получить полноценный ORM. это будет борьба с трудностями и непонятно с какой целью.
советую думать о разных пользователях как о носителях разных ролей, а не как о разных типах данных. это проще и гибче, т.к. допускается "множественность" ролей и не требуется хардкодить
пользователю может быть назначена роль "клиент" или "сотрудник" или "руководитель отдела маркетинга" или несколько ролей сразу. что касается разного набора полей для разных пользователей — можно создать полный набор в таблице 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.
Не в сети
Страницы 1