Laravel Eloquent Pivot Table с полиморфными связями на нем - PullRequest
0 голосов
/ 25 апреля 2019

В моем проекте есть следующие модели, которые я не могу связать:

  • Подписка (представляет компанию, которая является подписчиком приложения)

  • Клиент (один из клиентов компании, являющейся абонентом)

  • Подрядчик (подрядчик, которого использует компания по подписке)

  • Пользователь (может быть присоединен к подписке [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 для определения ролей пользователя на основе того, является ли он внутренним пользователем (без клиента или подрядчика), клиентом или подрядчиком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...