web-dev-qa-db-fra.com

Laravel rejoindre avec 3 tables

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 :)

20
Plic Pl

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

Approche modèle

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;
38
vFragosop

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();
1
JM4

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.

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

Regarde

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

pour voir les résultats.

print_r($data[shares]);die;

pour une autre requête Il suffit de donner la description de votre table

0
Mohd Abdullah