2015-08-28 8 views
1

У меня есть эта схема enter image description hereLaravel - Жестокие отношения моделей, полиморфные или нет?

Все отношения здесь должны быть один к нулю/один. A user может быть либо employee, либо customer. user_type ENUM дает мне тип, поэтому я знаю, куда идти оттуда. Тогда employee может быть либо basic, либо manager. Диктатор employee_type дайте мне знать об этом.

Как я должен строить отношения «Ярко-образная модель»?

Предположим, у меня есть пользователь, который является сотрудником. Мне нужно получить общие поля из таблицы users, но также необходимо получить общие поля из таблицы employees. Мне нужен жесткий код и знаю, что когда user_type=emp мне нужно выбрать из таблицы employees? Что делать, если мне нужно добавить другой тип пользователя позже?

UPDATE
ли это имеет смысл изменить схему в чем-то проще?
Моя проблема заключается в том, что при использовании, как это было предложено, полиморфные отношения я бы в конечном итоге что-то вроде этого:
$ пользователя = новый User :: userable() -> Применяемый() -> ...

Будет ли схема, в которой я удаляю таблицу сотрудников, и у меня есть employee_managers и employee_basics, связанные с таблицей пользователей?

+0

может быть все, что вам нужно всего три таблицы, пользователи, типы, функции? – mdamia

+0

@mdamia Я получаю таблицу пользователей. Таблица 'types' будет содержать что-то вроде« customer, employee_manager, employee_basic ». Как насчет таблицы 'functions'? – Cristian

+0

Таблица Funtions представляет собой комбинацию из трех других таблиц. – mdamia

ответ

0

Это полиморфное отношение. но если вы хотите быть легким, вам нужно исправить некоторые вещи.

в сотрудниках таблицы

- user_id 
- employable_id 
- employable_type enum(Manager, Basic) # References to the target model 
.... this last two are for the polymorphic relation, this is the nomenclature 

в основах и менеджеров таблице вы можете удалить user_id поля, но вам нужно поле идентификатора в качестве приращения типа

и теперь в модели Employee вам нужно сделать эту функцию

public function employable(){ 
    return $this->morphTo(); 
} 

Я надеюсь, что это работает :)

+0

Но я думаю, что я могу сделать то же самое для таблицы пользователей. Имейте userable_id и userable_type и удалите user_id для сотрудников. И таким образом у меня будет идентификатор пользователей, идентификатор сотрудников и позволяет сказать id менеджеров. Эти три идентификатора будут отличаться, но представляют одного и того же пользователя. Я прав? – Cristian

+0

, в этом случае вы должны изменить функцию занятости от morphTo до MorphMany, потому что FK находится в другой таблице –

+0

Я не понимаю. Почему MorphMany, когда мои отношения равны нулю? – Cristian

Смежные вопросы