Laravel ORM Freundschaft Beziehung ohne Duplizierung

8

Was ist der beste Weg, um eine Freundschaftsbeziehung mit beredten zu modellieren? Mein Tabellenschema ist unten und ich möchte eine Beziehung definieren, in der ich alle Freunde wie folgt abrufen könnte.

%Vor%

Die obige Beziehung funktioniert fast, wenn ich nach Freunden mit der Benutzer-ID 3 suche. Ich bekomme die Benutzer 1 und 3, aber natürlich will ich 1 und 2.

Freundschaftstisch

user_id: Die Benutzer-ID, die die Freundschaft angefordert hat friend_id: Die Benutzer-ID des anvisierten Freundes state: Ob die Freundschaft ansteht, akzeptiert oder blockiert ist.
created_at und updated_at

Ich bin mir bewusst, dass es Lösungen von Laravel Viele bis viele selbst-referenzierende Tabellen funktionieren nur in einer Richtung , wo ich die Freunde von beiden Seiten der Beziehung abrufen kann, aber ich muss zwei Zeilen haben, zum Beispiel wenn Benutzer 1 und 3 Freunde sind, dann in einer Zeile user_id = 3 und friend_id = 1, und in der nächsten Reihe umgekehrt. (Oder wenn ich nicht zwei Zeilen habe, muss ich zwei Abfragen durchführen).

    
Thomas Clarkson 25.07.2013, 02:32
quelle

3 Antworten

3
___ qstntxt ___

Was ist der beste Weg, um eine Freundschaftsbeziehung mit beredten zu modellieren? Mein Tabellenschema ist unten und ich möchte eine Beziehung definieren, in der ich alle Freunde wie folgt abrufen könnte.

%Vor%

Die obige Beziehung funktioniert fast, wenn ich nach Freunden mit der Benutzer-ID 3 suche. Ich bekomme die Benutzer 1 und 3, aber natürlich will ich 1 und 2.

Freundschaftstisch

user_id: Die Benutzer-ID, die die Freundschaft angefordert hat friend_id: Die Benutzer-ID des anvisierten Freundes state: Ob die Freundschaft ansteht, akzeptiert oder blockiert ist.
created_at und updated_at

Ich bin mir bewusst, dass es Lösungen von Laravel Viele bis viele selbst-referenzierende Tabellen funktionieren nur in einer Richtung , wo ich die Freunde von beiden Seiten der Beziehung abrufen kann, aber ich muss zwei Zeilen haben, zum Beispiel wenn Benutzer 1 und 3 Freunde sind, dann in einer Zeile user_id = 3 und friend_id = 1, und in der nächsten Reihe umgekehrt. (Oder wenn ich nicht zwei Zeilen habe, muss ich zwei Abfragen durchführen).

    
___ tag123php ___ PHP ist eine weit verbreitete, dynamische, objektorientierte und interpretierte Skriptsprache, die primär für die serverseitige Webentwicklung entwickelt wurde. ___ tag123orm ___ Objektrelationales Mapping (ORM) ist eine Technik, um objektorientierte Systeme auf relationale Datenbanken abzubilden. ___ answer17907150 ___

Ich habe einen Vorschlag, dass Sie Bedingungen verwenden, um die gewünschten values ​​zu laden

  • In diesem Beispiel nehmen wir an, dass Sie die Abfrage verwendet haben, um user_id und fiend_id mit der Bedingung

    zu laden

    "Wählen Sie * von frienddship WHERE user_ID = '$ id' ODER friend_ID = '$ id'"

$ id: ist die Benutzer-ID, die Sie seinen Freunden zeigen möchten.

Innerhalb der WHILE-Schleife in PHP, die Sie verwenden werden, um die Ergebnisse zu laden, können Sie Results filtern, indem Sie Bedingung

erstellen %Vor%

In diesem Fall werden Sie Daten aus den Tabellenspalten laden und dann jedes Mal die Spalte mit der Benutzer-ID filtern und nur die ID seines Freundes, den Filter verwenden, um dem Benutzer nicht zu sagen, dass Sie mit ihm befreundet sind.

Entschuldigung, ich habe mysql benutzt, um das Beispiel zu erklären

    
___ qstnhdr ___ Laravel ORM Freundschaft Beziehung ohne Duplizierung ___ tag123laravel ___ Laravel ist ein Open-Source-PHP-Web-Framework, das dem MVC-Muster folgt. ___ answer17856662 ___

Sie können zwei Suchläufe durchführen, und eine Union-Abfrage verwenden , sodass Sie nur einmal auf die Datenbank zugreifen. Setzen Sie all das in eine benutzerdefinierte Funktion:

%Vor%     
___ tag123laravel4 ___ Laravel 4.2 ist die Vorgängerversion des von Taylor Otwell entwickelten Open-Source-PHP-Webentwicklungs-MVC-Frameworks. Laravel hilft Ihnen beim Erstellen von Anwendungen mit einer einfachen, aussagekräftigen Syntax. ___ antwort18281150 ___

Sie sollten nicht versuchen, die zwei Zeilen in eine Zeile umzuwandeln, aber wenn Sie das versuchen, müssen Sie die Datenbank definitiv nicht zweimal drücken:

%Vor%

Das wäre in Laravel:

%Vor%

Sie können auch Sub-Whores erstellen, um sie zu gruppieren, aber das ist ein wenig kompliziert.

    
___
Phil Sturgeon 16.08.2013, 19:54
quelle
5

Sie können zwei Suchläufe durchführen, und eine Union-Abfrage verwenden , sodass Sie nur einmal auf die Datenbank zugreifen. Setzen Sie all das in eine benutzerdefinierte Funktion:

%Vor%     
Laurence 25.07.2013 11:26
quelle
-3

Ich habe einen Vorschlag, dass Sie Bedingungen verwenden, um die gewünschten values ​​zu laden

  • In diesem Beispiel nehmen wir an, dass Sie die Abfrage verwendet haben, um user_id und fiend_id mit der Bedingung

    zu laden

    "Wählen Sie * von frienddship WHERE user_ID = '$ id' ODER friend_ID = '$ id'"

$ id: ist die Benutzer-ID, die Sie seinen Freunden zeigen möchten.

Innerhalb der WHILE-Schleife in PHP, die Sie verwenden werden, um die Ergebnisse zu laden, können Sie Results filtern, indem Sie Bedingung

erstellen %Vor%

In diesem Fall werden Sie Daten aus den Tabellenspalten laden und dann jedes Mal die Spalte mit der Benutzer-ID filtern und nur die ID seines Freundes, den Filter verwenden, um dem Benutzer nicht zu sagen, dass Sie mit ihm befreundet sind.

Entschuldigung, ich habe mysql benutzt, um das Beispiel zu erklären

    
Hamza Trabelsi 28.07.2013 10:13
quelle

Tags und Links