2016-01-04 4 views
1

Я попал в проблему в своем веб-приложении, и я надеюсь, что какая-то душа может помочь мне.laravel отношение отношений модели на стержнях?

В моем приложении у меня есть пользователи и организации - организация может иметь много пользователей и пользователь может иметь много организаций на мой взгляд, это представляет собой многие-ко-многим?

User n:m Organisation 

Это значит, что мне нужен сводный стол? Назовем это Organisation_User. На данный момент все кажется достаточно простым, однако мое осложнение приходит, что пользователь в организации могут иметь различные роли,

1) Администратор
2) Менеджер
3) Финансы
4) Основные

только правило с этими ролями заключается в том, что администратор передает все остальное. Моя проблема заключается в том, что пользователь может теоретически быть основным пользователем, а также финансовым пользователем в той же организации. Я изо всех сил пытаюсь работать, как лучше хранить эти данные, я храню его непосредственно в сводной таблице? Или я создаю стержень поворота примерно как Organisation_User_Roles, и если это так, возможно ли это в Laravel? Как это будет выглядеть?

+0

Возможно, добавьте столбец, например, 'role', чтобы сворачивать таблицу и установить уникальный индекс как' user_organisation_role' smth? – xAoc

+0

Это все хорошо, но пользователь может иметь несколько ролей в организации, столбец ролей не мог это представить. – Udders

+0

И может быть ситуация, когда у пользователя есть финансовая роль в организации и у нее нет основной роли? – xAoc

ответ

0

Прочитано Получение Intermediate столбцов таблицы раздел из

https://laravel.com/docs/5.1/eloquent-relationships#many-to-many

В сводной таблице вы можете добавить дополнительный Колум roles где вы запятой разделить роли (имена или идентификаторы) и построить специальный метод hasRole в ваших моделях.

Остерегайтесь, однако, этот подход может иметь проблемы с масштабируемостью!


Другой путь был бы создать Role модель и дополнительную таблицу organisation_user_role со структурой

organisation_id 
user_id 
role_id 

В вашей User модели построить метод hasRoleInOrganisation($role_id, $organisation_id), который будет запрашивать эту таблицу.

Этот подход не имеет Laravelish способом, если вы запрашиваете эту таблицу. Вы должны использовать:

DB::table('organisation_user_role') 
    ->whereUserId($this->id) 
    ->whereOrganisationId($organisation_id) 
    ->whereRoleId($role_id) 
    ->count(); 
+0

Спасибо за это, я подумал об этих подходах, но не думаю, что они будут хорошо масштабироваться, я сейчас думаю, имея отношение 1: n от моей таблицы organisation_user и работая таким образом. Что вы думаете об этом? – Udders

+0

Я до сих пор не понимаю, где у вас будут ассоциации ролей. единственный масштабируемый способ, который я вижу до сих пор, - это второй подход, который я предложил. –

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