添加在您的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
之一。
請嘗試更改''partiancipants()''返回$ this-> belongsToMany(App \ User,'conversation_participants','conversation_id','user_id');'。並試着在你的控制器中用戶:: with('participants') - > get();' –