Laravel Polymorphic Relations Has Many Through

前端 未结 5 1736
闹比i
闹比i 2020-12-09 09:37

I have a Subscriber Model

// Subscriber Model

id
user_id
subscribable_id
subscribable_type

public function user()
{
    return $this->belongsTo(\'App\\U         


        
相关标签:
5条回答
  • 2020-12-09 09:49

    In addition to Matt's approach, the following code also could be another solution:

    //Topic Model
    public function users()
    {
        return $this->belongsToMany(User::class, 'subscribers', 'subscribale_id', 'user_id')
            ->where('subscribale_type', static::class);
    }
    

    In this way Subscriber treated as a pivot table and second argument is table name for pivot.

    The third argument is the foreign key name of the model on which you are defining the relationship, while the fourth argument is the foreign key name of the model that you are joining to. Read more here.

    Consider the where clause after belongsToMany to filter only the current model.

    0 讨论(0)
  • 2020-12-09 09:56
    // Topic Model
    
    public function users()
    {
        return $this->hasManyThrough('App\User', 'App\Subscriber', 'subscribable_id')->where('subscribable_type', array_search(static::class, Relation::morphMap()) ?: static::class);
    }
    

    Polymorphic hasManyThrough relationships are the same as any others, but with an added constraint on the subscribable_type, which can be retrieved from the Relation::morphMap() array, or by using the class name directly.

    0 讨论(0)
  • 2020-12-09 09:59

    try this package https://github.com/staudenmeir/eloquent-has-many-deep

    then you could use it like this:

    class Topic extends Model
    {
        use \Staudenmeir\EloquentHasManyDeep\HasRelationships;
        public function users()
        {
            return $this->hasManyDeep(
                'App\User',
                ['App\Subscriber'],
                [null, ['subscribable_type', 'subscribable_id']]
            );
        }
    }
    
    0 讨论(0)
  • 2020-12-09 10:03

    Ok, i got a better solution

    // Subscriber Model
    
    use Notifiable;
    
    public function receivesBroadcastNotificationsOn()
    {
        return 'App.User.' . $this->user_id;
    }
    
    
    // Send Notification
    
    Notification::send($post->subscribers, new TestNotification($post));
    
    0 讨论(0)
  • 2020-12-09 10:04

    What you're after is not hasManyThrough, but morphedByMany.

    hasManyThrough is useful when you have A one-to-many B, B one-to-many C, and you want to use A to fetch many C.

    What you have is a polymorphic pivot table sitting in the middle between A and C.

    // Topic Model
    
    public function users()
    {
        return $this->morphedByMany('App\User', 'subscribable', 'pivot/subscriber_table_name');
    }
    

    Docs: https://laravel.com/docs/6.x/eloquent-relationships#many-to-many-polymorphic-relations

    0 讨论(0)
提交回复
热议问题