2 votes

Existe-t-il un moyen de vérifier plus d'une correspondance avec une valeur minimale à partir d'une table de relation ?

J'ai 2 tables relationnelles "users" et "user_categories" (dans la table des catégories d'utilisateurs, "user_id" et "category_id" sont enregistrés).

J'ai maintenant besoin de rechercher les utilisateurs qui ont une catégorie commune correspondant à une valeur de pourcentage.

Plus clairement, je reçois 2 valeurs dans ma requête 1. un tableau d'identifiants de catégories à faire correspondre. 2. Pourcentage à faire correspondre.

Donc si category_ids = array(1,2,3,4,5,6,7,8,9,10) ;

et valeur_de_pourcentage = '100%' ;

Ensuite, la sortie devrait contenir tous les utilisateurs qui correspondent aux 10 identifiants de catégorie.

Si valeur_pourcentage = '30%' ;

Ensuite, le résultat devrait contenir tous les utilisateurs qui correspondent à 3 identifiants de catégorie.

Maintenant, si j'utilise 'whereIn()', il renvoie les utilisateurs qui correspondent à une valeur minimum, ce qui n'est pas ce que je veux.

C'est très compliqué de faire une telle requête. Toute aide sera appréciée.

2voto

DigitalDrifter Points 10485

Tout d'abord, vous devez nommer votre tableau croisé dynamique category_user à suivre Conventions de dénomination éloquentes .

Ensuite, on prend l'intersection du tableau des identifiants de catégorie reçus et des identifiants de catégorie associés à l'utilisateur. Calculez ensuite le pourcentage de l'intersection / total et comparez-le à la valeur seuil :

// filter only users with at least "percentage_value" or greater matching category ids.
$users = User::all()->filter(function (User $user) {
    $userCategoryIds = $user->categories->pluck('id')->toArray();
    $ids = array_intersect(request()-get('category_ids'), $userCategoryIds);
    return (count($ids) / count(request()->get('category_ids'))) >= request()->get('percentage_value');
});

1voto

nazim Points 884

Je ne suis pas familier avec Eloquent mais voici la syntaxe sql pour la requête avec un paramètre ":givenPercentage" à lier avec votre pourcentage.

SELECT user_id 
FROM (
    SELECT user_id, COUNT(user_id) AS user_cats 
    FROM user_categories GROUP BY user_id) user_cat_count
WHERE
    user_cats / (SELECT count(category_id) FROM categories) > :givenPercentage

Vous créez effectivement une sous-requête pour compter le nombre de catégories dans lesquelles se trouve chaque utilisateur. Ensuite, vous comparez les comptes avec le total des catégories dans la clause where et vous vérifiez s'il est supérieur à un certain pourcentage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X