1
votes

Laravel appartient à plusieurs conditions de relation

J'ai créé une relation plusieurs-à-plusieurs en utilisant la fonction belongsToMany :

$doctors = Doctor::with(['categories' => function($query) {
    $query->where('categories.id', '=', 1);
}])->get();

Maintenant, je veux créer une requête avec une condition plusieurs-à-plusieurs. En SQL, ce serait:

$doctors = Doctor::with(['categories' => function($query) {
    $query->where('category_id', '=', 1);
}])->get();

J'ai essayé de réaliser ceci comme:

SELECT *
FROM `doctors`
JOIN `doctors_to_categories`
    ON `doctors_to_categories`.`doctor_id` = `doctors`.`id`
WHERE `doctors_to_categories`.`category_id` = 1

Ou

XXX

Mais cela ne fonctionne pas. Des idées comment ça devrait être? Merci pour toute aide.


0 commentaires

3 Réponses :


2
votes

L'utilisation de -> with () ne limite pas réellement les résultats de la requête Doctor :: ...-> get () ; il indique simplement à Laravel ce qu'il doit renvoyer dans l'attribut relations . Si vous voulez réellement imposer le renvoi uniquement des médecins qui ont une relation de catégorie 1, vous devez utiliser whereHas():

$doctors = Doctor::whereHas('categories', function($query) {
  $query->where('categories.id', '=', 1); 
  // `id` or `categories.id` should work, but `categories.id` is less ambigious
})->get();


0 commentaires

2
votes

La fonction with () n'introduit pas réellement de jointure dans votre requête, elle charge simplement la relation de tous les modèles comme une seconde requête. La fonction with () ne pouvait donc pas modifier le jeu de résultats d'origine.

Ce que vous recherchez est whereHas () . Cela ajoutera une clause WHERE EXISTS à la requête existante.

$doctors = Doctor::with('categories')->whereHas('categories', function ($query) {
    $query->where('categories.id', 1);
})->get();


0 commentaires

0
votes

Vous pouvez ajouter une condition whereHas pour cela. Essayez le code ci-dessous:

$doctors = Doctor::with('categories')->whereHas('categories', function($query) {
        $query->where('id', 1);
    })->get();


0 commentaires