[英]Laravel/Eloquent - Modeling a HasOne relationship via a BelongsToMany relationship
假設我有四張桌子:
一個組可以有任意數量的activities
,一個活動可以通過它們的中間表group_activities
屬於任意數量的groups
,並且一個用戶通過users.group_id
屬於一個組。 我想正確地 model users
和activities
之間的關系,以便用戶可以擁有任何一項活動,但前提是該用戶所屬的組與該活動有關系。
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.