Besoin d'aide ?

Requête complexe : SQL vers ELOQUENT

Avatar de Seeryos
Seeryos

Bonjour à tous,

J'éprouve quelques difficultés sur une requête assez complexe que j'aimerais résoudre en utilisant Eloquent. La requête en question :

                SELECT users.*, count(*) as number 
                FROM user_category 
                INNER JOIN users 
                ON users.id = user_category.user_id 
                WHERE (category_id = 30 OR category_id = 33) 
                GROUP BY user_id 
                HAVING number = 2

En gros, mes utilisateurs sont triés par catégorie. Je souhaite récupérer les utilisateurs qui appartiennent à la fois à la catégorie 30 ET à la catégorie 33. Niveau SQL, les résultats semblent correctes. Maintenant niveau Eloquent j'ai beaucoup de difficultés.

J'ai commencé par faire ceci :

                User::whereHas('categories', function(Builder $query) use ($categories){
                    foreach ($categories as $category) {
                        $query->where('id', $category);
                    }
                })->where('id', '<>', $request->user()->id)->with('categories')->paginate($this->pagination)

Mais ça n'est pas très concluant puisque ça me ressort les utilisateurs avec la catégorie 30 OU 33 ... J'ai tenté avec un whereIn mais même chose (logique). Je sèche un peu

Merci de votre aide !

Posté il y a 6 mois
Avatar de stockhausen
stockhausen
   foreach ($categories as $category) {
                        $query->**orWhere**('id', $category);
                    }
Posté il y a 5 mois
Avatar de bestmomo
bestmomo

Salut,

Tu as essayé un truc comme ça ?

User::whereHas('categories', function($query) {
    $query->where('categories.id', 30)->where('categories.id', 33);
})->get();
Posté il y a 5 mois
Avatar de Seeryos
Seeryos

Hello !

Merci @bestmomo pour ta réponse. J'étais passé à côté. Au final ça me renvoyait toujours un tableau vide car une occurence ne pouvait pas avoir plusieurs catégories en même temps !

Du coup je suis passé sur quelque chose comme ça :

User::select('users.*', DB::raw('count(*) as total'))
->join('user_category', 'users.id', '=', 'user_category.user_id')
->whereIn('user_category.badge_id', $categories) // $categories est un tableau avec les id de catégorie. Pas sûr d'être obligé de garder cette ligne c'était pour faire un pré-tri.
->groupBy('user_category.user_id')
->having('total', '=', count($categories))->with('categories')->paginate($this->pagination)

Et là ça fonctionne nickel :) Tu en penses quoi ?

@stockhausen non car justement avec un OR c'est au moins l'un des catégories. Il me les faut toutes !

Posté il y a 3 mois

Vous ne pouvez pas répondre à ce sujet.