簡體   English   中英

Laravel/Eloquent - 通過 BelongsToMany 關系建模 HasOne 關系

[英]Laravel/Eloquent - Modeling a HasOne relationship via a BelongsToMany relationship

假設我有四張桌子:

  • 用戶
  • 團體
  • 活動
  • group_activity

一個組可以有任意數量的activities ,一個活動可以通過它們的中間表group_activities屬於任意數量的groups ,並且一個用戶通過users.group_id屬於一個組。 我想正確地 model usersactivities之間的關系,以便用戶可以擁有任何一項活動,但前提是該用戶所屬的組與該活動有關系。

HasOneThrough 似乎在這里不起作用,因為與用戶相關的組有多個活動。 HasManyThrough 不起作用,因為用戶只能擁有一個。

我想正確地 model 這種關系,以便可以通過 Nova 關系字段自動選擇它,但我正在努力弄清楚我將如何做到這一點。 我的第一個想法是與一組子查詢的 HasOneThrough 關系,但我不能完全拼湊出從哪里開始。

我將如何做到這一點,或者相反,是否可以通過 Eloquent 的自動關系系統來實現?

為了確保我們對您的關系有相同的想法:

組和活動之間的關系是多對多關系( 多對多 - Larvel 文檔)。

group_activities表是 pivot 表。

用戶和組之間的關系是一對多關系One To Many - Larvel Documentation和它的逆One To Many (Inverse) - Larvel Documentation

要實際回答您的問題:

如果您想使用從用戶到他們的活動的快捷方式,Has Many Through 是正確的方法。 如果一個組可以有任意多個活動,並且一個用戶屬於一個組,則該用戶將通過該組與這些任意多個活動相關聯-因此具有許多通過。 請注意,這並不是真正的單獨關系,它只是一個方便的快捷方式。

如果您不想直接將用戶與單個活動相關聯,則需要通過用戶和活動之間單獨的一對多關系來實現。

我不完全確定我是否正確解釋了您的問題,因此以下只是一個假設,但您是否要確保用戶只能與也與用戶組相關聯的活動相關聯? 所以要按組限制可能的活動? 如果是這種情況,您只需檢查所選活動是否在與用戶組關聯的活動中:

像這樣建立您的關系:

class User {

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

    public function possibleActivities(){
         return $this->hasManyThrough('App\Activity','App\Group');
    }
}

您可以像這樣檢查和關聯活動:

if( $user->possibleActivities()->contains( $activity ) ){
    $user->activity()->associate($activity);
}

暫無
暫無

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

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