Heim >Datenbank >MySQL-Tutorial >Wie kann man drei Tabellen in Laravel effizient verbinden, um Beiträge von verfolgten Benutzern abzurufen?
In diesem Szenario erstellen Sie eine Twitter-ähnliche Anwendung, in der Sie Beiträge von Benutzern anzeigen müssen, die aktuell sind Benutzer folgt. Da Sie über drei Tabellen verfügen, nämlich „Benutzer“, „Follower“ und „Freigaben“, ist es für den Abruf der gewünschten Daten von entscheidender Bedeutung, zu verstehen, wie diese effektiv verknüpft werden.
Das Ziel besteht darin, alle Freigaben abzurufen, bei denen die user_id aus der Tabelle „Freigaben“ mit der „user_id“ übereinstimmt follower_id aus der Followers-Tabelle, und die user_id aus der Followers-Tabelle stimmt mit der ID aus der Users-Tabelle überein.
Sie haben versucht, die folgende Abfrage zu verwenden:
<code class="php">$shares = DB::table('shares') ->leftjoin('followers', 'shares.user_id', '=', 'followers.follower_id') ->leftjoin('users', 'followers.user_id', '=', 'users.id') ->where('users.id', 3) ->where('shares.user_id', 'followers.follower_id') ->get();</code>
Das Problem bei dieser Abfrage liegt jedoch in der Beitrittsbedingung für Shares und Follower. Der richtige Join sollte lauten:
<code class="php">->leftjoin('followers', 'shares.user_id', '=', 'followers.user_id')</code>
Anstelle der Verwendung des Datenbankabfrage-Builders wird empfohlen, Laravel-Modelle für einen strukturierteren und effizienteren Ansatz für Datenbankoperationen zu verwenden .
So können die Modelle definiert werden:
<code class="php">class User extends Model { public function shares() { return $this->hasMany('Share'); } public function followers() { return $this->belongsToMany('User', 'follows', 'user_id', 'follower_id'); } public function followees() { return $this->belongsToMany('User', 'follows', 'follower_id', 'user_id'); } } class Share extends Model { public function user() { return $this->belongsTo('User'); } }</code>
Sobald die Modelle definiert sind, können Sie Abfragen wie diese ausführen:
<code class="php">$my = User::find('my_id'); // Retrieves all shares by users that I follow // eager loading the "owner" of the share $shares = Share::with('user') ->join('follows', 'follows.user_id', '=', 'shares.user_id') ->where('follows.follower_id', '=', $my->id) ->get('shares.*'); // Notice the shares.* here // prints the username of the person who shared something foreach ($shares as $share) { echo $share->user->username; }</code>
In diesem Beispiel ruft die Abfrage alle Shares ab, bei denen die user_id aus der Shares-Tabelle mit der follower_id aus der Followers-Tabelle übereinstimmt und die user_id aus der Followers-Tabelle mit der aktuellen Benutzer-ID übereinstimmt, die in der Variablen $my gespeichert ist.
Das obige ist der detaillierte Inhalt vonWie kann man drei Tabellen in Laravel effizient verbinden, um Beiträge von verfolgten Benutzern abzurufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!