Есть ли способ проверить более одного совпадения с минимальным значением из таблицы отношений?

У меня есть 2 реляционные таблицы «пользователи» и «user_categories». (В пользовательских категориях таблицы «user_id» и «category_id» сохраняется)

Теперь мне нужно искать пользователей, у которых есть общая категория, соответствующая процентному значению.

Более ясно, что я получаю 2 значения в моем запросе 1. массив идентификаторов категорий для сопоставления. 2. Процент для сопоставления.

Так, если category_ids = array (1,2,3,4,5,6,7,8,9,10);

и процент_значение = ‘100%’;

Тогда на выходе должны быть все пользователи, которые соответствуют всем 10 идентификаторам категории.

Если процентное значение = «30%»;

Тогда на выходе должны быть все пользователи, которые соответствуют любым 3 категориям.

Теперь, если я использую ‘whereIn ()’, он возвращает пользователей, которые соответствуют минимальному значению 1, что мне не нужно.

Это очень сложно сделать такой запрос. Любая помощь будет оценена.

2

Решение

Во-первых, вы должны назвать свою сводную таблицу category_user следить Красноречивые соглашения об именах.

Во-вторых, возьмите пересечение массива полученных идентификаторов категорий и идентификаторов категорий, связанных с пользователем. Затем вычислите процентную долю от общего / общего и сравните с пороговым значением:

// 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');
});
2

Другие решения

Я не знаком с Eloquent, но ниже приведен синтаксис sql для запроса с параметром «: GivenPercentage», который будет связан с вашим процентом.

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

Вы фактически создаете подзапрос для подсчета количества категорий, в которых находится каждый пользователь. Затем вы сравниваете значения с общими категориями в предложении where и проверяете, превышает ли он определенный процент.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector