wake-up-neo.com

Laravel-Join mit 3 Tischen

Ich baue eine Twitter-ähnliche App. Es gibt einen Feed, in dem ich nur Beiträge von Nutzern anzeigen möchte, denen ich folge.

Ich habe alles mit Joins versucht, aber nichts scheint zu funktionieren.

Ich habe 3 Tabellen: Users, Followers, Shares

Die Tabellen sehen so aus:

Benutzer : id

Follower : user_id, follower_id

Shares : user_id

Was ich brauche, ist "ALL Shares WHERE share.user_id = followers.follower_id" "

Angenommen, die users.id ist 3, ich habe folgendes versucht:

$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();

Aber es funktioniert nicht.

Jede Hilfe wird geschätzt :)

20
Plic Pl

Ich glaube, dein Beitritt ist falsch:

$shares = DB::table('shares')
    ->join('users', 'users.id', '=', 'shares.user_id')
    ->join('followers', 'followers.user_id', '=', 'users.id')
    ->where('followers.follower_id', '=', 3)
    ->get();

Ich empfehle Ihnen auch, Ihre Tabelle als follows zu bezeichnen. Es ist etwas natürlicher, user has many followers through follows und user has many followees through follows zu sagen.

Beispiel

$shares = DB::table('shares')
    ->join('users', 'users.id', '=', 'shares.user_id')
    ->join('follows', 'follows.user_id', '=', 'users.id')
    ->where('follows.follower_id', '=', 3)
    ->get();

Modellansatz

Ich wusste nicht, dass Sie DB::-Abfragen und keine Modelle verwenden. Ich fixiere also die Antwort und gebe viel mehr Klarheit. Ich schlage vor, dass Sie Modelle verwenden, es ist viel einfacher für diejenigen, die mit dem Framework und speziell mit SQL beginnen.

Beispiel für Modelle:

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');
    }
}

Beispiel für die Modellnutzung:

$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;
}

// Retrieves all users I'm following
$my->followees;

// Retrieves all users that follows me
$my->followers;
38
vFragosop

In Bezug auf die allgemeine MySQL-Syntax wird dies am besten geschrieben:

SELECT * FROM USER a JOIN FOLLOWERS b ON (a.id = b.user_id) JOIN SHARES c on (b.follower_id = c.user_id) WHERE a.id = 3

gibt einen Datensatz aller Follower und ihrer jeweiligen Anteile zurück.

Ich glaube, Sie würden in Laravel Folgendes erwarten

DB::table('USER')
  ->join('FOLLOWERS', 'USER.id', '=', 'FOLLOWERS.user_id')
  ->join('SHARES', 'FOLLOWERS.follower_id', '=', 'SHARES.user_id')
  ->where('USER.id', 3)
  ->get();
1
JM4

Anstatt 

    ->where('shares.user_id', 'followers.follower_id')

Es sollte sein

    ->whereRaw('shares.user_id=followers.follower_id')

denn im ursprünglichen Beispiel wird 'followers.follower_id' als String interpretiert.

0
svin
$shares = DB::table('users')
->leftjoin('followers', 'users.user_id', '=', 'followers.follower_id')
->leftjoin('shares', 'shares.user_id', '=', 'users.id')
->where('users.id', 3)
->get();

Schau mal

0
Mad an
$data[shares] = DB::table('shares')
        ->leftjoin('followers', 'shares.user_id', '=', 'followers.follower_id')
        ->leftjoin('users', 'users.id', '=', 'users.id')
        ->where('users.id','=', 3)
        ->get();

um Ergebnisse zu sehen.

print_r($data[shares]);die;

für andere Fragen Geben Sie einfach eine Beschreibung Ihrer Tabelle an

0
Mohd Abdullah