Je pense que votre jointure est erronée :
$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 comme follows
au lieu de cela, il semble un peu plus naturel de dire que 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();
Approche modèle
Je n'avais pas réalisé que vous utilisiez DB::
des requêtes et non des modèles. Je corrige donc la réponse et je fournis beaucoup plus de clarté. Je vous suggère d'utiliser des modèles, c'est beaucoup plus facile pour ceux qui débutent 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;