具有多态关系的Laravel雄辩数据透视表

时间:2019-04-24 22:20:46

标签: laravel eloquent

我的项目中有以下模型,无法链接:

  • 订阅(代表应用程序订阅者的公司)

  • 客户(作为订户的公司客户之一)

  • 承包商(订阅公司使用的承包商)

  • 用户(可以附加到订阅[subscription_user枢纽],但也可以与客户或承包商相关)。

所以我的问题是,subscription_user数据透视表需要user_idsubscription_idcompany_idcompany_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_idcompany_type

任何帮助将不胜感激。

我是否可能以错误的方式来处理?我应该创建一个client_user表和一个contractor_user表并将用户链接到订阅吗?如果是这样,如何获得所有嵌套用户的订阅?这很重要,因为我使用subscription_user数据透视表根据用户是内部用户(无客户端还是承包商),客户端还是承包商来确定用户的角色。

0 个答案:

没有答案