Heim > Datenbank > MySQL-Tutorial > Wie kann man drei Tabellen in Laravel effizient verbinden, um Beiträge von verfolgten Benutzern abzurufen?

Wie kann man drei Tabellen in Laravel effizient verbinden, um Beiträge von verfolgten Benutzern abzurufen?

Linda Hamilton
Freigeben: 2024-10-25 07:09:29
Original
1032 Leute haben es durchsucht

How to Efficiently Join Three Tables in Laravel to Retrieve Posts from Followed Users?

Laravel: Zusammenführen von drei Tabellen zum Datenabruf

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.

Verwenden des Database Query Builder

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Verwendung von Modellen für erweiterte Funktionalität

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>
Nach dem Login kopieren

Abfrageausführung mithilfe von Modellen

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage