Laravel Join avec plusieurs tables pour filtrer le contenu
Dans cet article, nous abordons un défi courant rencontré lors de la création d'une plateforme de médias sociaux à l'aide de Laravel : récupérer du contenu spécifique basé sur des relations complexes entre plusieurs tables. Nous fournirons une solution complète utilisant à la fois des requêtes SQL brutes et l'ORM Laravel Eloquent.
Énoncé du problème
L'objectif est de créer un flux de type Twitter qui affiche les publications uniquement des utilisateurs suivis par l'utilisateur actuel. Pour y parvenir, nous devons filtrer le tableau "Partages" en fonction des conditions suivantes :
Solution SQL
Bien que la requête SQL d'origine fournie puisse sembler correcte, un ajustement mineur est requis pour l'ordre de jointure et la condition pour fonctionne correctement. La requête SQL corrigée suivante joint efficacement les trois tables et applique le filtrage spécifié :
$shares = DB::table('shares') ->join('users', 'users.id', '=', 'shares.user_id') ->join('followers', 'followers.user_id', '=', 'users.id') ->where('followers.follower_id', '=', 3) ->get();
Alternativement, l'utilisation de l'ORM Eloquent offre une approche plus élégante et encapsulée. Voici une solution basée sur un modèle :
User.php (Modèle)
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'); }
Partage.php (Modèle)
public function user() { return $this->belongsTo('User'); }
Controller.php (Controller)
$my = User::find('my_id'); $shares = Share::with('user') ->join('follows', 'follows.user_id', '=', 'shares.user_id') ->where('follows.follower_id', '=', $my->id) ->get(); foreach ($shares as $share) { echo $share->user->username; }
Cette approche fournit une solution plus flexible et plus maintenable, garantissant l'intégrité des données et des requêtes efficaces.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!