Mysql
 sql >> Base de données >  >> RDS >> Mysql

Laravel se joint à 3 tables

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;