簡體   English   中英

Laravel 多態關系有很多通過

[英]Laravel Polymorphic Relations Has Many Through

我有一個Subscriber模型

// Subscriber Model

id
user_id
subscribable_id
subscribable_type

public function user()
{
    return $this->belongsTo('App\User');
}

public function subscribable()
{
    return $this->morphTo();
}

和一個Topic模型

// Topic Model

public function subscribers()
{
    return $this->morphMany('App\Subscriber', 'subscribable');
}

我想通過Subscriber模型讓所有用戶都像這樣通知他們

Notification::send($topic->users, new Notification($topic));

// Topic Model


public function users()
{
    return $this->hasManyThrough('App\User', 'App\Subscriber');
}

有任何想法嗎?

// 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
        );
}

多態hasManyThrough關系與任何其他關系相同,但對subscribable_type增加了約束,可以從Relation::morphMap()數組中檢索,或直接使用類名。

除了 Matt 的方法之外,以下代碼也可能是另一種解決方案:

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

通過這種方式, Subscriber被視為數據透視表,第二個參數是數據透視表的表名。

第三個參數是您在其上定義關系的模型的外鍵名稱,而第四個參數是您要加入的模型的外鍵名稱。 在這里閱讀更多。

考慮belongsToMany之后的where子句來僅過濾當前模型。

你所追求的不是hasManyThrough ,而是morphedByMany

當您有A一對多BB一對多C並且您想使用A獲取多個C時, hasManyThrough很有用。

您擁有的是一個位於AC中間的多態數據透視表。

// Topic Model

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

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

試試這個包https://github.com/staudenmeir/eloquent-has-many-deep

那么你可以像這樣使用它:

class Topic extends Model
{
    use \Staudenmeir\EloquentHasManyDeep\HasRelationships;
    public function users()
    {
        return $this->hasManyDeep(
            'App\User',
            ['App\Subscriber'],
            [null, ['subscribable_type', 'subscribable_id']]
        );
    }
}

好的,我有一個更好的解決方案

// Subscriber Model

use Notifiable;

public function receivesBroadcastNotificationsOn()
{
    return 'App.User.' . $this->user_id;
}


// Send Notification

Notification::send($post->subscribers, new TestNotification($post));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM