Maison >base de données >tutoriel mysql >Comment rejoindre efficacement trois tables dans Laravel pour récupérer les publications des utilisateurs suivis ?
Dans ce scénario, vous créez une application de type Twitter dans laquelle vous devez afficher les publications des utilisateurs dont le compte actuel l'utilisateur suit. Puisque vous disposez de trois tables, à savoir les utilisateurs, les abonnés et les partages, il est crucial de comprendre comment les rejoindre efficacement pour récupérer les données souhaitées.
L'objectif est de récupérer tous les partages dont l'id_utilisateur de la table Shares correspond au follower_id de la table Followers et user_id de la table Followers correspond à l'identifiant de la table Users.
Vous avez essayé d'utiliser la requête suivante :
<code class="php">$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();</code>
Cependant, le problème avec cette requête réside dans la condition de jointure pour les partages et les abonnés. La jointure correcte doit être :
<code class="php">->leftjoin('followers', 'shares.user_id', '=', 'followers.user_id')</code>
Au lieu d'utiliser le générateur de requêtes de base de données, il est recommandé d'utiliser des modèles Laravel pour une approche plus structurée et plus efficace des opérations de base de données. .
Voici comment les modèles peuvent être définis :
<code class="php">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'); } }</code>
Une fois les modèles définis, vous pouvez exécuter des requêtes comme celle-ci :
<code class="php">$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; }</code>
Dans cet exemple, la requête récupère tous les partages où l'ID utilisateur de la table Shares correspond à l'ID follower_id de la table Followers, et l'ID utilisateur de la table Followers correspond à l'ID de l'utilisateur actuel stocké dans la variable $my.
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!