Php 有没有一种方法可以从关系表中用最小值检查多个匹配项?

Php 有没有一种方法可以从关系表中用最小值检查多个匹配项?,php,mysql,laravel,orm,Php,Mysql,Laravel,Orm,我有两个关系表“users”和“user\u categories”。(在用户类别表“user\u id”和“category\u id”中保存) 现在,我需要搜索具有与百分比值匹配的公共类别的用户 更清楚地说,我在请求1中收到了2个值。要匹配的类别ID的数组。2.要匹配的百分比 因此,如果类别_id=数组(1,2,3,4,5,6,7,8,9,10) 百分比_值='100%' 那么Output应该拥有与所有10个类别ID匹配的所有用户 如果百分比_值='30%' 然后out应该拥有与任意3个类别

我有两个关系表“users”和“user\u categories”。(在用户类别表“user\u id”和“category\u id”中保存)

现在,我需要搜索具有与百分比值匹配的公共类别的用户

更清楚地说,我在请求1中收到了2个值。要匹配的类别ID的数组。2.要匹配的百分比

因此,如果类别_id=数组(1,2,3,4,5,6,7,8,9,10)

百分比_值='100%'

那么Output应该拥有与所有10个类别ID匹配的所有用户

如果百分比_值='30%'

然后out应该拥有与任意3个类别ID匹配的所有用户

现在,如果我使用“where()”,它将返回与最小值1匹配的用户,这不是我所需要的


进行这样的查询要复杂得多。任何帮助都将不胜感激。

首先,您应该命名您的pivot table
category\u user

其次,获取接收到的类别ID数组和与用户关联的类别ID的交集。然后计算区间/总计的百分比,并将其与阈值进行比较:

// 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,但下面是使用“:givenPercentage”参数与百分比绑定的查询的sql语法

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子句中的总类别进行比较,并检查其是否高于某个百分比。

好的,非常感谢。我有合适的命名约定等。在这里发布了一个例子来解释我的问题。让我试试这个。感谢您在请求函数中的注释中出现了一些错误。箭头没有完成,应该是array_intersect而不是array_diff。但我仍然认为你的答案是正确的,因为你给出的答案非常快,并告诉我应该去哪里。非常感谢并非常尊重您。很好地了解了intersect vs diff。我已经用您的建议更新了答案。干杯