2017-02-21 118 views
-1

我正在開發一個CRM,其中有一個用戶模型,可以與其他用戶建立多對多關係,並通過數據透視表定義一種關係類型。Laravel 5.3與同一模型的多對多關係

例如:

蒂姆 - >湯姆(同事)

蒂姆 - >史蒂夫(家庭成員)

蒂姆 - >喬恩(鄰居)

在我的用戶模型我有這個地方我使用數據透視表中的user1_id和user2_id作爲外鍵:

public function relationships() 
{ 
    return $this->belongsToMany(User::class,null,'user1_id','user2_id')->withTimestamps()->withPivot('type'); 
} 

在一個方向上工作正常。所以,如果我稱之爲:

User::find($timsID)->relationships; 

能夠按照預期工作,我會得到湯姆史蒂夫·喬恩作爲結果。現在,如果我在該查詢中使用Tom的ID,Tim將不會返回關係,因爲當Tom's ID存儲在user2中時,它將在user1_id上搜索。

如果有任何外鍵匹配,是否有解決方案來提取記錄?我不想爲每個關係存儲2條記錄。

+0

什麼是您的數據透視表?你似乎通過'null'。 – EddyTheDove

+0

它是user_user。由於遵循laravel命名約定,所以我傳遞null,並且它在默認情況下傳遞null。 – tecshaun

回答

1

我會假設我有點理解你想要做什麼。 Laravel的關係在雙向工作。在你的情況下,你只定義了一個方向,但是想要在兩個方向上使用它。清除我的意思

public function peopleIKnow() { 
    return $this->belongsToMany(User::class,null,'user1_id','user2_id')->withTimestamps()->withPivot('type'); 
} 

public function peopleWhoKnowMe() { 
    return $this->belongsToMany(User::class,null,'user2_id','user1_id')->withTimestamps()->withPivot('type'); 
} 

這樣你就有雙向關係。你可以建立在這個想法之上來獲得你想要的東西。

+0

謝謝我明白,但在這種情況下,現在我必須進行2個呼叫,爲一組結果做2個查詢。即使我這樣做,我如何將兩組結果合併成一個集合? – tecshaun

+0

謝謝你降低我的表現,儘管我是唯一一個試圖幫助你的人。無論如何,對於你想要做的事情,你將不得不放棄Eloquent,並通過查詢你自己的位置來檢查'user1_id'或'user2_id'。 – EddyTheDove

+0

我沒有倒下你,如果我這樣做,它根本不是故意的。實際上剛剛提高了你的評價。 – tecshaun