2017-06-02 2 views
0

Par exemple: J'ai ces modèles dans mon application. User, Profile, Interest.Laravel interrogeant plusieurs modèles connexes

J'ai lié la table users avec la table profiles en ajoutant la colonne user_id dans le tableau profiles. Et j'ai lié profiles et interests en utilisant un tableau croisé dynamique (interest_profile), qui est (comme évident) aura deux colonnes (profile_id, interest_id). Cependant, je veux interroger les utilisateurs qui sont associés à un profil, voir aussi qui est associé à un intérêt particulier, En d'autres termes: "sélectionner tous les utilisateurs qui ont (dans leurs profils) un intérêt particulier".

Je sais que je peux le faire avec du SQL brut en joignant les quatre tables et ensuite utiliser (where clause) .. Mais je veux le faire à la manière de Laravel.

Merci d'avance.

Répondre

1

d'abord, assurez-vous que vous avez votre configuration des relations correctement sur vos modèles:

class User extends Model 
{ 
    public function profile() 
    { 
     return $this->hasOne(Profile::class); 
    } 
} 

class Profile extends Model 
{ 
    public function user() 
    { 
     return $this->belongsTo(User::class); 
    } 

    public function interests() 
    { 
     return $this->belongsToMany(Interest::class, 'interest_profile'); 
    } 
} 

class Interest extends Model 
{ 
    public function profiles() 
    { 
     return $this->belongsToMany(Profile::class, 'interest_profile'); 
    } 
} 

Ensuite, vous pouvez utiliser whereHas() pour contraindre une requête par un modèle connexe et la notation par points pour les relations imbriquées. Donc, votre requête serait:

User::whereHas('profile.interests', function($query) use ($interestName) { 
    return $query->where('name', $interestName); 
})->get(); 

Cela ne ferait que renvoyer une collection d'utilisateurs. Si vous souhaitez renvoyer leurs profils et intérêts, vous utiliserez également with():

User::whereHas('profile.interests', function($query) use ($interestName) { 
    return $query->where('name', $interestName); 
}) 
->with('profile.interests') 
->get(); 
1

En supposant que le modèle User a une relation profile et le modèle Profile a une relation interests, vous pouvez le faire.

$interest_id = 1; 

$users = User::whereHas('profile', function ($query) use ($interest_id) { 
    $query->whereHas('interests', function ($query) use ($interest_id) { 
     $query->where('id', $interest_id); 
    }); 
})->get();