2017-05-10 31 views
2

我有四個表格。 User, Conversations, Message and Conversation_ParticipantsI hope you don't find a relationship error in this image (我希望你不覺得這圖像中的關係錯誤)Laravel獲得與參與者的所有對話當前用戶參與

我試圖函數

public function conversations(){ 

    return $this->belongsToMany(Conversation::class, 'conversation_participants', 'user_id', 'conversation_id'); 
} 

添加到User::class但如果我叫User::with('conversations')->get()我只得到所有現有的用戶。我究竟做錯了什麼?首先,我想獲得當前用戶參與的所有對話,然後我想獲得對話的所有接收者。

我也試過

public function participants() 
{ 
    return $this->belongsToMany(User::class, 'conversation_participants', 'user_id', 'conversation_id'); 
} 

Conversation::classConversation::with('participants')->get()讓我所有的對話甚至是那些用戶不參與

我真的很困惑大氣壓:/

+0

請嘗試更改''partiancipants()''返回$ this-> belongsToMany(App \ User,'conversation_participants','conversation_id','user_id');'。並試着在你的控制器中用戶:: with('participants') - > get();' –

回答

2

添加在您的User模型如下:

public function conversations() { 
    return $this->belongsToMany(Conversation::class, 'conversation_participants', 'users_id', 'conversations_id'); 
} 

這對您的Conversation型號:

public function participants() { 
    return $this->belongsToMany(User::class, 'conversation_participants', 'conversation_id', 'users_id'); 
} 

如果您想鏈接你的表更容易,read up on conventions

要獲得所有用戶的參與對話,運行以下(假設你已經加載的用戶):$user->conversations()讓所有的談話用戶在

如果希望所有用戶,他們的所有對話都與以下所有參與者進行了對話:$users = Users::with('conversations.participants')->get()。現在,您可以通過這個循環如下:

foreach($users as $user) { 
    foreach($user->conversations as $conversation) { 
     foreach($conversations->participants as $participant) { 
      // do fancy stuff here 
     } 
    } 
} 

注意,從你開始對用戶來說也是一個參與者,所以也許你需要再次篩選,一出。

如果你想變得更加花哨(但使用更多的資源),你甚至可以查詢對話所有的消息!

User::with('conversations.participants', 'conversations.messages.user')->get() 

但是這隻能在你設置了第二組沿上表的關係在你的形象(conversations <-> messages <-> users)

編輯

在評論,OP詢問是否有可能限制從數據庫檢索的消息數量,這可能是我的知識,但是現在如果這是最好的方法,我現在不會:

從第一個eage中刪除消息R裝入部分:

User::with('conversations.participants') 

之後,通過對話循環時,延遲加載消息:後以$ conversation->消息

$conversation->load(['messages' => function($query){ 
    $query->take(5); 
}, 'users']); 

訪問它們。

注意

我認爲這可能一氣呵成更容易做,但我沒有安裝,現在來測試這個給你。

編輯2

Ronon添加另一條評論後,這裏就是我想出了:

添加在Conversation模型的新關係:

public function last_messages() { 
    return $this->hasMany(Message::class, 'conversation_id', 'id')->latest()->limit(2); 
} 

正因爲如此,你現在可以做到這一點:

User::with('conversations.participants', 'conversations.last_messages.users')->get() 

如果您仍然想要所有消息,則可以使用messages關係。如果你想減少,使用last_messages之一。

+0

哇,謝謝。帶有消息的部分將在下一步中執行。但有沒有辦法限制消息加載?例如只加載最後5條消息?消息也有'$ table-> timestamps()'attr,所以排序不成問題。 – Ronon

+0

是的,讓我編輯我的答案! –

+0

@Ronon它現在在那裏 –

1

呼叫User::with('conversations')->get()不指定用戶。我可能會被誤讀,但我認爲你正在尋找的東西像下面這樣:

$user = User::with('conversations')->find(1); 
$userConversations = $user->conversations; 

這將爲您提供一個用戶和他們的談話。

+0

最後一行的括號不是必需的,只會讓你回到查詢模式。其餘的,現貨! –

+0

謝謝,趕上! –

相關問題