2014-02-11 76 views
12

在Laravel中定義多對多關係時,使用belongsToMany()或hasManyThrough()有什麼區別?Laravel中的多對多關係:belongsToMany()與hasManyThrough()

例子: User Account Account_User

因此,用戶有一個多對多的關係,通過Account_User表帳戶。除了定義與相關用戶相關的帳戶的透視表之外,它還存儲Account_User.role字段,該字段確定給定用戶在給定帳戶中具有哪個角色。

使用User belongsToMany() AccountUser hasManyThrough() Account Account_User會產生什麼影響?或者這基本上是一樣的?

當決定一個方法時,我想我應該對反向關係定義使用相同的方法。

+0

有許多通過不適合您的方法。消極的是,你將不得不爲透視表添加一個Eloquent模型。正如我在回答中所說的那樣,它們是不同的東西,對於你的例子來說,很多通過並不合適。認爲Account_user是帳戶和用戶表的一部分,不像第三個表。 – Arda

回答

12

比方說,你有兩種模式,我們姑且稱之爲AB

如果A可能有B, 不止一個項目,也 如果B可能有A 多個項目(這樣想博客文章/標籤) 你必須使用belongsToMany();

現在假設您有3個型號,ABC

ABB有關C。但是,你需要訪問這是關係到A(超過B)所有C的,那麼你需要使用hasManyThrough() (認爲像countries - >users - >posts,你需要從特定country所有post S)

hasManyThrough()並不完全適用於多對多的關係,它更像是一條捷徑。

檢查文檔鏈接,1,2(Laravel 4.2)或3,4(Laravel 5.x)。

+1

我明白了,所以我更新了更具體的問題。我根本沒有真正明白這兩種方法的優點/缺點 - 或者根本不同。 – preyz

+3

真的沒有優點和缺點,因爲它們都在做不同的事情。 'belongsToMany()'通常包含一個數據透視表,'hasManyThrough()'只是'hasMany'的一個快捷方式,所以如果你設置了'hasManyThrough()'關係,而不是'countries-> users-> posts',所有你需要做的是'countries-> posts'; – user3158900