Je construis une application de type Twitter. Il existe un flux dans lequel je souhaite uniquement afficher les messages des utilisateurs que je suis.
J'ai tout essayé avec des jointures, mais rien ne semble fonctionner.
J'ai 3 tables: Users
, Followers
, Shares
Les tableaux ressemblent à ceci:
Utilisateurs : id
Suiveurs : user_id
, follower_id
Actions : user_id
Ce dont j'ai besoin, c'est "TOUS les partages WHERE share.user_id = followers.follower_id" "ANDWHERE followers.user_id = users.id"
Supposons, le users.id est 3, j'ai essayé ceci:
$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();
Mais ça ne marche pas.
Toute aide est appréciée :)
Je crois que votre participation est fausse:
$shares = DB::table('shares')
->join('users', 'users.id', '=', 'shares.user_id')
->join('followers', 'followers.user_id', '=', 'users.id')
->where('followers.follower_id', '=', 3)
->get();
Je vous suggère également de nommer votre table sous la forme follows
à la place, il est un peu plus naturel de dire user has many followers through follows
et user has many followees through follows
.
Exemple
$shares = DB::table('shares')
->join('users', 'users.id', '=', 'shares.user_id')
->join('follows', 'follows.user_id', '=', 'users.id')
->where('follows.follower_id', '=', 3)
->get();
Je n'avais pas réalisé que vous utilisiez des requêtes DB::
et non des modèles. Je corrige donc la réponse et apporte beaucoup plus de clarté. Je vous suggère d'utiliser des modèles, c'est beaucoup plus facile pour ceux qui commencent avec le framework et spécialement SQL.
Exemple de modèles:
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');
}
}
Exemple d'utilisation du modèle:
$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;
En termes de syntaxe MySQL générale, ceci s’écrit le mieux:
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
renverra un ensemble de données de tous les suiveurs et de leurs parts respectives.
Je crois que vous voudriez le suivant à Laravel
DB::table('USER')
->join('FOLLOWERS', 'USER.id', '=', 'FOLLOWERS.user_id')
->join('SHARES', 'FOLLOWERS.follower_id', '=', 'SHARES.user_id')
->where('USER.id', 3)
->get();
Au lieu de
->where('shares.user_id', 'followers.follower_id')
CA devrait etre
->whereRaw('shares.user_id=followers.follower_id')
parce que, dans l'exemple original, "followers.follower_id" est interprété comme une chaîne.
$shares = DB::table('users')
->leftjoin('followers', 'users.user_id', '=', 'followers.follower_id')
->leftjoin('shares', 'shares.user_id', '=', 'users.id')
->where('users.id', 3)
->get();
Regarde
$data[shares] = DB::table('shares')
->leftjoin('followers', 'shares.user_id', '=', 'followers.follower_id')
->leftjoin('users', 'users.id', '=', 'users.id')
->where('users.id','=', 3)
->get();
pour voir les résultats.
print_r($data[shares]);die;
pour une autre requête Il suffit de donner la description de votre table