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