У меня есть 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, что мне не нужно.
Это очень сложно сделать такой запрос. Любая помощь будет оценена.
Во-первых, вы должны назвать свою сводную таблицу 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');
});
Я не знаком с 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 и проверяете, превышает ли он определенный процент.