2016-10-11 2 views
0

Ich habe folgende Tabellen:Abfrage derselben Tabelle mit Pivot-Tabelle

Benutzer - id, Benutzername, usw.
Gespräche - id, privat, usw.
conversation_user - id, user_id, conversation_id

Es gibt zwei Datensätze in der Tabelle conversation_user für jede geöffnete/begonnene Konversation (könnte mehr sein, wenn eine Konversation Multi-User ist). Eins für Benutzer als Empfänger/Empfänger, ein anderes für einen Benutzer als Absender. Lassen Sie uns sagen: user_id = 1, conversation_id = 1 und user_id = 2, conversation_id = 1.

Wie kann ich alle Benutzer/Benutzernamen auswählen, mit denen ich ein offenes Gespräch führe? Alle Teilnehmer, um genau zu sein.

Ich nehme an, ich muss eine Konversation ID bekommen, die ich bin Teilnehmer und dann eine Reverse-Lookup für andere Benutzer in der Konversation. Aber bisher kein Glück ... Bei diesem Reverse Lookup blieb ich stecken. Ich spiele mit Laravel 5.3 und MySQL.

Antwort

0

Zuerst benötigen Sie eine has_started_conversation Art von boolean auf Ihrer Pivot-Tabelle, conversation_user.

Wie in der docs erwähnt, müssen Sie die Beziehungen zwischen Ihren Conversation und User Modellen definieren.

Benutzer

class User extends Model 
{ 
    public function conversations() 
    { 
     return $this->belongsToMany('App\Conversation')->withPivot('has_started_conversation'); 
    } 
} 

Conversation

class Conversation extends Model 
    { 
     public function users() 
     { 
      return $this->belongsToMany('App\User')->withPivot('has_started_conversation'); 
     } 
    } 

Dann

// get a users conversations 
$conversations = \App\User::first()->conversations; 
// select a single conversation, or maybe multiple with a for loop? 
$important_conversation = $conversations->random(); 
// get the participants of that conversation 
$participants = $important_conversation->users; 
+0

Benötige ich wirklich, dass boolean? Wenn ich eine Konversation starte, erstellt sie automatisch Datensätze in Konversationen und Konversations-Benutzertabellen. Conversations ID ist eine Verbindung zwischen allen Teilnehmern und ein Beweis, dass die Konversation begonnen hat, IMHO ... – Vezlius

+0

können Sie sich auf den ersten Benutzer verlassen, der an der Konversation angeschlossen ist, aber dann müssen Sie Zeitstempel verfolgen. Es ist Ihre Wahl. – Bartu

Verwandte Themen