Maison > base de données > tutoriel mysql > Comment rejoindre efficacement trois tables dans Laravel pour récupérer les publications des utilisateurs suivis ?

Comment rejoindre efficacement trois tables dans Laravel pour récupérer les publications des utilisateurs suivis ?

Linda Hamilton
Libérer: 2024-10-25 07:09:29
original
1039 Les gens l'ont consulté

How to Efficiently Join Three Tables in Laravel to Retrieve Posts from Followed Users?

Laravel : joindre trois tables pour la récupération de données

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.

Utilisation du générateur de requêtes de base de données

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>
Copier après la connexion

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>
Copier après la connexion

Utilisation de modèles pour des fonctionnalités améliorées

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>
Copier après la connexion

Exécution de requêtes à l'aide de modèles

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal