В моем проекте есть следующие модели, которые я не могу связать:
Подписка (представляет компанию, которая является подписчиком приложения)
Клиент (один из клиентов компании, являющейся абонентом)
Подрядчик (подрядчик, которого использует компания по подписке)
Пользователь (может быть присоединен к подписке [subscription_user pivot], но также может быть связан с Клиентом или Исполнителем).
Итак, моя проблема в том, что для сводной таблицы subscription_user
нужны user_id
, subscription_id
, company_id
и company_type
, если компания является подрядчиком или клиентом.
Итак, моя модель пивота выглядит так:
class SubscriptionUser extends Pivot
{
public function company() {
return $this->morphTo();
}
}
На моем пользователе я думаю, что отношения настроены правильно, например:
public function clients() {
return $this->hasManyThrough('App\Client', 'App\SubscriptionUser', 'user_id', 'id', null, 'company_id')->where('company_type', 'App\Client');
}
public function contractors() {
return $this->hasManyThrough('App\Contractor', 'App\SubscriptionUser', 'user_id', 'id', null, 'company_id')->where('company_type', 'App\Contractor');
}
А на Заказчика / Исполнителя:
public function subscriptionUsers() {
return $this->morphMany('App\SubscriptionUser', 'company');
}
public function users() {
return $this->hasManyThrough('App\User', 'App\SubscriptionUser', 'company_id', 'id', null, 'user_id')->where('company_type', 'App\Client');
}
Но я не могу понять, как легко добавлять или удалять пользователей для клиента / подрядчика. Должен ли я делать $client->subscription->users()->syncWithoutDeatching([...]);
или client->subscription->users()->attach($user, ['company' => $client]);
, когда я хочу добавить пользователя в клиент и подписку? Проблема с этим заключается в том, что она, похоже, не признает компанию как полиморфную область. Нужно ли вручную устанавливать company_id
и company_type
в сводной области?
Любая помощь будет принята с благодарностью.
Возможно, я подхожу к этому неправильно? Должен ли я создать таблицу client_user
и таблицу contractor_user
и связать пользователей с подпиской таким образом? Если так, как я могу получить всех вложенных пользователей для подписки? Это очень важно, потому что я использую сводную таблицу subscription_user для определения ролей пользователя на основе того, является ли он внутренним пользователем (без клиента или подрядчика), клиентом или подрядчиком.